Binary Exploitation
Easy
150 points
Canary Intro
Recuite 2025 - HCMUS
6 tháng 10, 2025
Stack Canary
Information Leak
Buffer Overflow

Binary Exploitation
Canary Intro - Writeup#
Thông tin Challenge#
- Thể loại: Pwn
- Độ khó: Beginner
- Protections: Full (PIE, NX, Canary, RELRO, SHSTK, IBT)
Phân tích#
Bảo vệ Stack Canary#
Chương trình thể hiện cơ chế stack canary:
- In địa chỉ hàm
winlên màn hình - Gọi
dumpstack()hiển thị giá trị canary! - Nhận input với
scanf("%s")→ có thể gây buffer overflow vì không giới hạn độ dài - Hàm
mainkết thúc và return
Bố cục stack (stack layout)#
[rbp-0x20] buffer[24 bytes] ← nơi scanf ghi dữ liệu
[rbp-0x08] canary [8 bytes] ← bắt buộc phải giữ nguyên!
[rbp+0x00] saved rbp [8]
[rbp+0x08] return addr [8] ← mục tiêu: địa chỉ return → win
Lỗ hổng & Thông tin rò rỉ#
- Buffer overflow:
scanf("%s")không có giới hạn độ dài → có thể ghi vượt bộ đệm - Canary bị lộ:
dumpstack()in ra giá trị canary, nên kẻ tấn công biết giá trị canary thực tế - PIE leak: Địa chỉ hàm
winđược in ra (PIE bị rò rỉ hoặc chương trình không bật PIE)
Ý chính: Khi canary bị lộ, ta có thể vượt qua kiểm tra canary bằng cách ghi lại đúng giá trị đó trong payload.
Kỹ thuật khai thác#
Cấu trúc payload#
pythonpayload = b"A" * 24 # Đặt đầy buffer
payload += p64(canary) # Ghi đúng canary để không trigger __stack_chk_fail
payload += b"B" * 8 # Saved RBP (không quan trọng)
payload += p64(win_addr) # Return address -> win
Các bước exploit#
- Đọc (parse) địa chỉ
wintừ output chương trình. - Đọc (parse) giá trị canary từ dump stack (dòng có ghi "<=== Stack canary" hoặc tương tự).
- Xây payload với chính xác giá trị canary đã lộ.
- Gửi payload tới chương trình.
- Khi canary được giữ nguyên, kiểm tra canary thành công → chương trình không gọi
__stack_chk_fail. - Khi hàm
mainreturn, return address trỏ tớiwin()→ spawn shell. - Lấy flag (ví dụ
cat flag.txt).
Flag#
BPCTF{canary_guards_your_stack_f1994a7d1cb2e0aaf69241ba160693ab}
Những bài học rút ra#
- Stack canaries rất hiệu quả chống overflow không có leak.
- Rò rỉ thông tin (information leaks) có thể phá hủy hiệu quả của canary — nếu attacker biết giá trị canary thì bypass dễ dàng.
- Defense in depth: Canary chỉ là một lớp bảo vệ — cần kết hợp ASLR/RELRO/NX/...
- Tuyệt đối không in/đưa ra dữ liệu nhạy cảm (ví dụ dump stack) trong môi trường production.
Chi tiết kỹ thuật#
- Canary trên x86-64 Linux thường lấy từ
fs:[0x28]. - Trước khi trả về, sẽ kiểm tra:
cmp rax, fs:[0x28](hoặcsub rax, fs:[0x28]rồije ok) — nếu sai sẽ gọi__stack_chk_fail. - Do đó payload phải bảo toàn giá trị canary nguyên vẹn để qua kiểm tra.
150
Points
Easy
Difficulty
Binary Exploitation
Category