คลัง
playbooks

Ghidra Playbook

Ghidra เป็น reverse engineering suite ฟรีจาก NSA ที่ใช้แก้โจทย์ reversing ได้ครบ คู่มือนี้เป็น end-to-end: ตั้ง project, การ navigate, คีย์ลัดทั้งหมด, การ rename/retype ให้ decompiler อ่านง่าย, เทคนิคแก้โจทย์ CTF (หา flag check, patch), และ scripting

IntermediateAdvanced#ghidra#reverse#decompiler#shortcuts#playbook#ctf

1. เริ่มต้น + import

  1. 1สร้าง Non-Shared Project → ตั้งชื่อ
  2. 2File → Import File → เลือก binary (Ghidra ระบุ format/arch อัตโนมัติ)
  3. 3ดับเบิลคลิกไฟล์เปิด CodeBrowser → ตอบ Yes ให้ auto-analyze
  4. 4รอ analysis เสร็จ (มุมขวาล่าง) — Ghidra หาฟังก์ชัน/string/xref ให้
  5. 5เริ่มที่ Symbol Tree → Functions → main (หรือ entry ถ้าไม่มี main)
  • Listing (กลาง): disassembly (assembly)
  • Decompiler (ขวา): pseudo-C — อ่านง่ายสุด (เปิดด้วย Window → Decompiler ถ้าไม่เห็น)
  • Symbol Tree (ซ้าย): functions, labels, imports, exports
  • Data Type Manager (ซ้ายล่าง): struct/type
  • Defined Strings (Window → Defined Strings): string ทั้งหมด
  • double-click ชื่อฟังก์ชัน/ตัวแปร = กระโดดไป definition; Alt+Left = ย้อนกลับ

3. คีย์ลัดสำคัญ

คีย์ทำอะไร
Lrename ตัวแปร/ฟังก์ชัน
Ctrl+Lretype (เปลี่ยน data type)
;ใส่ comment
Xดู cross-references (ใครเรียก/ใช้)
Ggoto address/label
Alt+← / Alt+→ย้อนกลับ/ไปข้างหน้า (navigation history)
Ctrl+Shift+Eหา string / search memory
Fสร้างฟังก์ชัน (ถ้า Ghidra ไม่ detect)
double-clickตามไป definition / xref

4. ทำ decompiler ให้อ่านง่าย

decompiler output ดิบๆ อ่านยาก (ชื่อ local_28, uVar1) การ rename + retype ทีละนิดทำให้โค้ดอ่านเข้าใจขึ้นมาก — เป็นหัวใจของการ reverse ฟังก์ชันซับซ้อน

  • rename ตัวแปร (L) ตามที่เข้าใจ เช่น local_28 → user_input
  • retype (Ctrl+L) ตัวแปรให้ตรง (เช่น int → char*, หรือ apply struct)
  • rename ฟังก์ชัน (L) ที่ Ghidra ตั้ง FUN_xxxxxx ตามหน้าที่
  • ใส่ comment (;) จุดที่เข้าใจแล้ว กันลืม
  • สร้าง struct ใน Data Type Manager ถ้าโปรแกรมใช้ struct
  • ทำซ้ำเรื่อยๆ — โค้ดจะค่อยๆ อ่านรู้เรื่องขึ้น

5. เทคนิคแก้โจทย์ CTF

  • หา flag check: Defined Strings หา 'Correct'/'Wrong' → X ดู xref → ไปฟังก์ชันที่เทียบ
  • reverse algorithm: อ่าน decompiler ของ check function → เข้าใจการ transform → เขียน solver ย้อนกลับ (Python)
  • strcmp/memcmp: หา call เหล่านี้ → argument ที่สองมัก hardcode flag/password
  • patch: Listing → คลิกขวา instruction → Patch Instruction (เช่นเปลี่ยน JNZ→JZ ข้าม check) → Export Program
  • xor/encode loop: เจอ loop ที่ xor → ดู key → decode เอง
  • ใช้คู่ dynamic: อ่าน Ghidra เข้าใจโครงสร้าง → gdb ยืนยันค่า runtime (ดูหัวข้อ Dynamic Analysis)
เริ่มทุกโจทย์ที่ Defined Strings (Ctrl+Shift+E) — หาคำเช่น 'flag', 'password', 'Correct' แล้ว X ดู xref ไปยังโค้ดที่เกี่ยวข้อง เป็นทางลัดที่เร็วสุด

6. Scripting (Ghidra Script)

Ghidra มี Script Manager (Window → Script Manager) รัน script Python/Java เพื่อ automate — เช่น deobfuscate, patch หลายจุด, ดึงข้อมูล ใช้ currentProgram, getFunctionAt(), ฯลฯ ผ่าน Flat API; เปิด Python console ได้ที่ Window → Python

7. Quick Reference

  • import → auto-analyze → Symbol Tree → main
  • คีย์: L rename, Ctrl+L retype, X xref, G goto, ; comment
  • Ctrl+Shift+E = หา string (เริ่มทุกโจทย์ที่นี่)
  • ทำอ่านง่าย: rename+retype ตัวแปร/ฟังก์ชันทีละนิด
  • flag check: string 'Correct' → X xref → reverse algorithm
  • patch: คลิกขวา instruction → Patch Instruction → Export
  • scripting: Script Manager (Python/Java) automate

🧭 จับมือทำทีละขั้น (มีแค่ Kali) + ถ้าติดไปไหนต่อ

สมมติได้ binary มาจากโจทย์ reverse engineering มีแค่ Kali ทำตามนี้ทีละขั้นเพื่อเปิดดูและหา flag

  1. 1เช็คว่ามี Ghidra ไหม: เปิดเมนู Kali หรือรัน `ghidraRun` (ถ้าไม่มี `sudo apt install ghidra -y`)
  2. 2ก่อนเปิด Ghidra ลองดูข้อมูลเบื้องต้นก่อนเสมอ: `file ./binary` และ `strings ./binary | grep -i flag`
  3. 3เปิด Ghidra → File → New Project (Non-Shared) → ตั้งชื่อ
  4. 4File → Import File → เลือก binary → กด OK (Ghidra เดา format/arch ให้อัตโนมัติ)
  5. 5ดับเบิลคลิกไฟล์ที่ import → ขึ้นถาม 'Analyze?' → กด Yes ให้ auto-analyze แล้วรอจนแถบสถานะมุมขวาล่างหยุดวิ่ง
  6. 6เปิด Window → Defined Strings (หรือ Ctrl+Shift+E) หาคำว่า flag/Correct/Wrong/password
  7. 7เจอ string ที่น่าสงสัย → double-click แล้วกด X (cross-reference) ดูว่าใครเรียกใช้ string นี้
  8. 8กระโดดไปฟังก์ชันที่เรียก → ดู Decompiler (หน้าต่างขวา) อ่าน pseudo-C
  9. 9อ่านไม่รู้เรื่อง → rename ตัวแปร (กด L) และ retype (Ctrl+L) ทีละตัวจนโค้ดเริ่มมีความหมาย
  10. 10เข้าใจ algorithm แล้ว → เขียน Python solver ย้อนกลับ หรือถ้าแค่ต้องข้าม check → คลิกขวา instruction → Patch Instruction
  11. 11ไม่แน่ใจค่า runtime จริง → เปิด gdb ควบคู่ยืนยันค่า (dynamic analysis) แล้วกลับมาเทียบกับที่อ่านใน Ghidra
จับมือ reverse ด้วย Ghidra
เช็คไฟล์เบื้องต้นก่อนเปิด Ghidra
file ./binary && strings ./binary | grep flag
✅ เจอ flag ตรงๆ ใน strings→ จบเลย ไม่ต้องเปิด Ghidra
❌ ไม่เจอ/ถูกเข้ารหัส→ เปิด Ghidra วิเคราะห์ต่อ
import + auto-analyze
File → Import → double-click → Yes analyze
หา string น่าสงสัยใน Defined Strings
Ctrl+Shift+E ค้น flag/Correct
✅ เจอ string เป้าหมาย→ X ดู cross-reference
❌ ไม่เจอ string ตรงๆ→ ไล่ดู Symbol Tree → main หรือ export function แทน
อ่าน Decompiler ของฟังก์ชันที่เจอ
อ่านเข้าใจไหม?
✅ เข้าใจ algorithm→ เขียน solver ย้อนกลับ
❌ งง ตัวแปรมั่ว (uVar1, local_28)→ rename (L) + retype (Ctrl+L) ทีละตัว
ต้องยืนยันค่า runtime จริงไหม?
✅ ต้อง→ เปิด gdb/dynamic analysis ควบคู่
❌ ไม่ต้อง static พอแล้ว→ เขียน solver / patch ได้เลย
ได้ flag / patch ผ่าน check แล้ว
ขั้นตอน/งานเครื่องมือใน Kaliติดตั้งเพิ่ม (ถ้าไม่มี)เครื่องมือออนไลน์
ดูข้อมูลไฟล์เบื้องต้นfile, strings--
decompile/reverse หลักghidra-dogbolt.org (เทียบหลาย decompiler)
ยืนยัน runtimegdb, gdb-peda/pwndbg--
decompiler ทางเลือก-IDA Free, Binary Ninja (personal)dogbolt.org
เขียน solver ย้อนกลับpython3-cyberchef (ลอง transform เร็วๆ)
ดู symbol/import เร็วๆobjdump, readelf, nm--
scripting automateGhidra Script Manager (Python/Java)--
🚑 ถ้าตันสนิท ลองท่าถัดไป: (1) decompile อ่านไม่รู้เรื่องเลยแม้ rename แล้ว → ลองอัปโหลดไปเทียบที่ dogbolt.org ดู decompiler ตัวอื่น (2) ต้องยืนยันค่าตอนรันจริง (เช่น input อะไรทำให้ผ่าน check) → ไป Dynamic Analysis ใช้ gdb แปะ breakpoint (3) เป็นโจทย์ pwn ไม่ใช่แค่ reverse (มี buffer overflow) → ไปหมวด Pwn (Buffer Overflow) แทน (4) ไฟล์มี anti-debug/packed → ไป Anti Debug ก่อนค่อยกลับมา reverse ต่อ

หัวข้อที่เชื่อมโยง

โน้ตของฉัน

ยังไม่มีโน้ตสำหรับหัวข้อนี้