题目分析
首先看一下开了哪些保护
因为开了NX,所以考虑使用ROP或者return-into-libc
用IDApro分析一下源代码
可以看出main函数中不存在注入点,我们看一下echo函数
在eho函数中,缓冲区至分配了0x10大小,但是传入的buf有0x400字节,因此可以看出存在溢出
不过拷贝遇到\x00就停止了,这个时候我们只能注入一个返回地址。
但是在ROPgadget里面能找到一个特殊的gadget,它就是破题的关键
我们先分析一下拷贝前的栈结构,(每格大小为8byte)
我们构造payload为’a’*0x18 + pop_4 + ROPchain,拷贝结束时栈的结构如下图所示
当4个pop完成时,栈结构如下
此时rsp指向ROPchain的开头,我们构造的rop链就能够执行了
第一次溢出的ROPchain如下:
pop rdi
read_got
puts_plt
main_addr
返回之后,第二次构造的ROPchain如下
pop rdi
/bin/sh addr
system
Exp
from pwn