HNctf pwn-ez_pwn

这个题写了我不理解的地方,其他细节可以看看其他师傅的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

  • 12
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值