Binary Exploitation
Easy
150 points

Canary Intro

Recuite 2025 - HCMUS
6 tháng 10, 2025
Stack Canary
Information Leak
Buffer Overflow
Recuite 2025 - HCMUS
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:

  1. In địa chỉ hàm win lên màn hình
  2. Gọi dumpstack() hiển thị giá trị canary!
  3. Nhận input với scanf("%s") → có thể gây buffer overflow vì không giới hạn độ dài
  4. Hàm main kế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ỉ#

  1. Buffer overflow: scanf("%s") không có giới hạn độ dài → có thể ghi vượt bộ đệm
  2. Canary bị lộ: dumpstack() in ra giá trị canary, nên kẻ tấn công biết giá trị canary thực tế
  3. 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#

python
payload = 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#

  1. Đọc (parse) địa chỉ win từ output chương trình.
  2. Đọc (parse) giá trị canary từ dump stack (dòng có ghi "<=== Stack canary" hoặc tương tự).
  3. Xây payload với chính xác giá trị canary đã lộ.
  4. Gửi payload tới chương trình.
  5. 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.
  6. Khi hàm main return, return address trỏ tới win() → spawn shell.
  7. Lấy flag (ví dụ cat flag.txt).

Flag#

BPCTF{canary_guards_your_stack_f1994a7d1cb2e0aaf69241ba160693ab}

Những bài học rút ra#

  1. Stack canaries rất hiệu quả chống overflow không có leak.
  2. 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.
  3. Defense in depth: Canary chỉ là một lớp bảo vệ — cần kết hợp ASLR/RELRO/NX/...
  4. 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ặc sub rax, fs:[0x28] rồi je 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