前言
久违地更新博客了,先水一篇题解吧。
题目分析
checksec
发现开了NX,栈不可执行了。
IDA
这里是把传进来的buf逐字节赋值给s2,这里有个问题,s2大小是0x10,但是buf有0x400,显然这里存在栈溢出。
解题思路
问题在于这个for循环,它的结束条件是读到\x00字节。换句话说就是当它在buf中读到00字节的时候就会停止拷贝字符串到s2,这就存在一个问题 ,之前的溢出好说,但是覆盖返回地址的时候,必然会出现00字节的情况,这就意味着我们的rop chains将到此终止。

根据函数调用栈的传参规则,main函数栈帧和echo函数栈帧的主要结构如上图所示,我们可以用gdb验证下:
可以看到buf和s2的距离就是0x20,也就是相距4个Qword。
由于在覆盖返回地址之后,如果我们接着输入构造 rop 的 gadgets是会截断的,这里我们用pop4的gadget来实现”跳跃“

可以看到如果我们这样输入,s2处填入pop4后还是会停止复制没错,不过我们因为pop4个Qword 的数据,程序因此会执行到buf处pop4后面的指令,即可构造rop chains。
exp
1 | from pwn import * |
LibcSearcher是第一次用,可以方便地获取libc的偏移,减少重复劳动。
至于为什么io.recvuntil(‘\x40’),自己写写exp就会知道了= =
总结
每一道题都仔细写wp有丶麻烦,闲着没事干的时候(不想做题)就水一篇吧(