这个题写了我不理解的地方,其他细节可以看看其他师傅的wp
有写的不对的地方欢迎师傅们指正
IDA看一下伪代码,可以看到两个read,还有printf函数,可以利用printf遇0截断,溢出ebp地址
然后利用栈迁移
使用gdb看ebp和输入的字符s的位置
b main
r
一直n 运行到vul函数
然后si
然后继续n运行到read
输入aaaa,然后stack 24查看栈
ebp与ecx的距离是 f68-f30,这里应该是栈地址f5c还存了一个栈地址f68,这个f68才是要和ecx进行计算的地址
payload这里单独写一下,问了师傅,给我画了个图方便理解,这里也放上来!我刚开始一直理解不了为什么要s+0x10
其实就是栈迁移的时候,一个栈空间是4个字节,代码里的aaaa其实就在图上ebp-0x38这个位置,也就是输入的字符s的位置,上面也说了,用gdb调试出来ebp与ecx的距离是 f68-f30=0x38。再回到这个图上,一个格子是4个字节,那四个格子就是16字节,16字节十六进制就是0x10,因为我们要把bin/sh放到栈上面用,所以s+0x10就相当于是第一个格子跳到了第五个格子,payload构造的时候四个参数已经用了前4个格子,/bin/sh就用第五个格子,这么说很抽象但是比较好理解
payload第二行,至于为什么要填充0x2c个字节,因为要把最后的返回地址改成leave,ret,所以要先栈溢出,先溢出然后返回到s也就是ebp的地址,然后最后把返回地址改成leave ret