Dynamic Analysis
Dynamic Analysis คือการวิเคราะห์ binary ด้วยการรันมันและสังเกตพฤติกรรม — ผ่าน debugger (gdb), trace (ltrace/strace) เห็นค่าจริงใน register/memory ตอนทำงาน ช่วยยืนยัน static และผ่าน obfuscation/encryption ได้ บทนี้ลงลึก ltrace/strace, gdb+gef ครบคำสั่ง, breakpoint/watchpoint, การ patch runtime, เทคนิคแก้โจทย์ และความปลอดภัย (ทำใน sandbox)
1. หลักการและความปลอดภัย
Dynamic analysis รันโปรแกรมแล้วดูพฤติกรรมจริง — ค่าตัวแปร, syscall, library call, control flow ที่เกิดขึ้นจริง จุดแข็งคือผ่าน obfuscation/encryption ได้ (ดูค่าหลัง decode ตอน runtime) และยืนยันสิ่งที่อ่านจาก static จุดอ่อนคือรันโค้ดที่อาจอันตราย
2. ltrace / strace — ดูเร็วๆ ก่อน debug
# ltrace — trace library calls (เห็น strcmp, printf args ตรงๆ)
ltrace ./binary
# เห็น เช่น: strcmp("user_input", "secret_flag") = ... ← flag โผล่!
# strace — trace syscalls (open, read, write, ...)
strace ./binary
strace -e trace=open,read,openat ./binary # เฉพาะบาง syscall
# ltrace + strace พร้อมกัน
ltrace -S ./binary3. GDB + GEF/pwndbg
GDB เป็น debugger หลัก เสริมด้วย GEF หรือ pwndbg (เพิ่ม UI/คำสั่งที่ช่วย reversing/pwn มาก — แสดง register, stack, disasm สวยงาม)
gdb ./binary
# breakpoint
break main # หรือ b *0x401234 (ที่ address)
b *main+50
# run / control
run [args] # r
continue # c
stepi / si # step 1 instruction
nexti / ni # step over 1 instruction
step / next # ระดับ source line (ถ้ามี)
finish # รันจนจบฟังก์ชันปัจจุบัน
# ดูค่า
info registers # i r (ดู register ทั้งหมด)
x/20x $rsp # ดู memory 20 word ที่ stack (hex)
x/s 0x402000 # ดู string ที่ address
x/20i $rip # ดู 20 instruction ถัดไป
p $rax # print ค่า register
p/x variable4. Breakpoint, watchpoint, แก้ค่า
# breakpoint ที่จุด compare (ดูค่าที่ถูกเทียบ)
b *0x401234 # ตรงก่อน strcmp/cmp
run
i r # ดู register ตอนนั้น (อาจเห็น flag ใน rdi/rsi)
x/s $rdi # ดู string ที่ argument
# watchpoint — หยุดเมื่อตัวแปร/memory เปลี่ยน
watch *0x404050 # หยุดเมื่อค่าที่ address นี้ถูกเขียน
rwatch *0x404050 # หยุดเมื่อถูกอ่าน
# แก้ค่า register/memory (ข้าม check / patch runtime)
set $rax = 1 # แก้ return value ให้ผ่านเงื่อนไข
set $eip = 0x401250 # กระโดดข้าม check
set {int}0x404050 = 0 # แก้ค่าใน memory
set $zero = 1 # แก้ flag (ZF) เปลี่ยนผล jump5. เทคนิคแก้โจทย์ CTF
- ltrace หา flag: ถ้าใช้ strcmp(input, flag) → ltrace เห็น flag ตรงๆ (ลองก่อนเสมอ)
- breakpoint ที่ compare: ตั้ง bp ก่อน cmp/strcmp → ดูค่าที่ถูกเทียบใน register
- patch runtime: set ค่า register/ZF ข้าม check (เห็น 'Correct' โดยไม่รู้ flag จริง — แต่บางโจทย์ flag คำนวณจาก input จึงต้อง reverse จริง)
- ดูค่าหลัง decode: string ที่ decode ตอน runtime → bp หลังจุด decode → x/s ดู
- dump memory: dump region ที่ decode/unpack แล้วออกมาวิเคราะห์ต่อ
- ใช้คู่ static: อ่าน Ghidra เข้าใจว่าจะ bp ตรงไหน → gdb ยืนยันค่าจริง
ltrace ./binary ก่อน (อาจเจอ flag เลย) → ถ้าไม่เจอ เปิด Ghidra หาจุด compare → gdb ตั้ง bp ตรงนั้นดูค่า runtime6. Quick Reference
- รันแล้วดูพฤติกรรมจริง — ผ่าน obfuscation/encryption ได้
- malware → ทำใน VM/sandbox ตัดเน็ต
- ltrace (library call — เห็น strcmp flag); strace (syscall)
- gdb+gef: b main, run, si/ni, i r, x/20x $rsp, x/s
- bp ที่ compare → ดูค่าที่เทียบ; watch หยุดเมื่อ memory เปลี่ยน
- set $rax/$eip/flag = patch runtime ข้าม check
- ดูค่าหลัง decode: bp หลัง decode → x/s; ใช้คู่ static
🧭 จับมือทำทีละขั้น (มีแค่ Kali) + ถ้าติดไปไหนต่อ
สมมติอ่าน static ไปแล้วยังไม่ชัด หรืออยากยืนยันค่าจริงตอนรัน มีแค่ Kali ลองทำตามนี้ทีละขั้น
- 1ltrace ./binary — ลองก่อนเสมอ (อาจเห็น strcmp(input, flag) ตรงๆ ในหน้าจอ)
- 2ถ้าไม่มีอะไรน่าสนใจ ลอง strace ./binary ดู syscall (open/read config/flag file?)
- 3เปิด gdb ./binary (ติดตั้ง gef หรือ pwndbg เสริม UI ให้ดู register/stack ง่ายขึ้น)
- 4b main แล้ว run ดูว่าหยุดปกติไหม (ถ้า crash ทันทีให้สงสัย anti-debug ก่อน)
- 5หา address จุด compare จาก ghidra ก่อน (หรือ disas main ดูคร่าวๆ ใน gdb)
- 6b *0x ตรงก่อน cmp/strcmp แล้ว run ให้หยุดตรงนั้น
- 7เมื่อหยุด: i r ดู register, x/s $rdi หรือ x/s $rsi ดู string ที่ถูกเทียบ
- 8ถ้าอยากบังคับผ่าน: set $rax = 1 หรือ set $eip =
- 9ถ้าค่าที่เห็นถูก decode/encrypt ตอนรัน: ตั้ง bp หลังจุด decode แล้ว x/s ดูผลลัพธ์
- 10สรุปค่าที่ได้ → กลับไปเขียน solver ใน static หรือปิดเคสได้เลย
| ขั้นตอน/งาน | เครื่องมือใน Kali | ติดตั้งเพิ่ม (ถ้าไม่มี) | เครื่องมือออนไลน์ |
|---|---|---|---|
| ดู library call เร็วๆ | ltrace | - | - |
| ดู syscall | strace | - | - |
| debug หลัก | gdb + gef/pwndbg | git clone gef.git / pwndbg.git | - |
| หา address จุด compare ก่อน debug | ghidra | apt install ghidra | dogbolt.org |
| disassemble เทียบเร็ว | objdump, radare2 | apt install radare2 | onlinedisassembler.com |
| hook แก้ค่าโดยไม่ patch ไฟล์ | frida | pipx install frida-tools | - |
| ถอดรหัสค่าที่ dump ได้ | python3 | - | CyberChef, dcode.fr |
หัวข้อที่เชื่อมโยง
โน้ตของฉัน
ยังไม่มีโน้ตสำหรับหัวข้อนี้