HN เปิดเผย: ส่วนขยาย Ghidra สำหรับส่งออกบางส่วนของโปรแกรมเป็นไฟล์อ็อบเจ็กต์
(github.com/boricj)ส่วนขยายตัวส่งออกไฟล์อ็อบเจ็กต์สำหรับ Ghidra
ส่วนขยาย Ghidra นี้ช่วยให้สามารถส่งออกบางส่วนของโปรแกรมเป็นไฟล์อ็อบเจ็กต์ได้ ไฟล์อ็อบเจ็กต์เหล่านี้มีเมทาดาทาที่ถูกต้อง (เช่น สัญลักษณ์, ตารางรีโลเคชัน ฯลฯ) จึงสามารถนำกลับไปใช้ใน toolchain ได้โดยตรง
กรณีการใช้งาน
- การแพตช์ไบนารีขั้นสูง: ใช้ linker เพื่อรวมส่วนต้นฉบับกับส่วนที่แก้ไข แทนการทำด้วยมือ
- การพอร์ตซอฟต์แวร์: แยกโค้ดที่ไม่ขึ้นกับระบบออกจากโปรแกรม แล้วแทนที่ส่วนที่เหลือ
- การแปลงรูปแบบไฟล์: แปลงโปรแกรมหรือไฟล์อ็อบเจ็กต์เป็นรูปแบบไฟล์อื่น
- การสร้างไลบรารี: แยกบางส่วนของโปรแกรมออกมาเพื่อนำไปใช้ซ้ำในบริบทอื่น
- โปรเจกต์ดิแอสเซมบลี/ดีคอมไพล์: แบ่งโปรแกรมออกเป็นไฟล์อ็อบเจ็กต์หลายไฟล์แล้วนำไปทำใหม่
สถาปัตยกรรมชุดคำสั่งและรูปแบบไฟล์อ็อบเจ็กต์ที่รองรับ
- x86: COFF (รองรับ), ELF (รองรับ)
- MIPS: COFF (ไม่รองรับ), ELF (รองรับ)
การบิลด์ (CLI)
- โคลนรีโพซิทอรีนี้
- ตั้งค่าตัวแปรสภาพแวดล้อม
GHIDRA_INSTALL_DIRให้ชี้ไปยังไดเรกทอรีติดตั้งของ Ghidra - รันคำสั่ง
gradle buildExtension - ไฟล์เก็บถาวรของส่วนขยาย Ghidra จะถูกสร้างในไดเรกทอรี
dist/
การติดตั้ง
- ดาวน์โหลดส่วนขยายจากหน้ารีลีส หรือบิลด์เองในเครื่อง
- ติดตั้งส่วนขยายในอินสแตนซ์ Ghidra ผ่าน
File > Install Extensions… - เปิดใช้งานปลั๊กอิน
RelocationTableSynthesizedPluginผ่านFile > Configureในหน้าต่าง CodeBrowser
วิธีใช้งาน
- เลือกชุดแอดเดรสในมุมมอง Listing
- รันตัววิเคราะห์
Relocation table synthesizer(ใช้ได้ในโหมด one-shot) - เรียกใช้ตัวส่งออกไฟล์อ็อบเจ็กต์แบบ relocatable ผ่าน
File > Export Program… - สามารถตรวจสอบตารางรีโลเคชันที่สร้างขึ้นใหม่ได้ที่
Window > Relocation table(synthesized)
- ⚠️ ตัววิเคราะห์ Relocation table synthesizer ต้องการฐานข้อมูล Ghidra ที่กรอกข้อมูลครบถ้วน (ประกาศสัญลักษณ์, ชนิดข้อมูล และการอ้างอิงได้อย่างถูกต้อง) ข้อมูลที่ไม่ถูกต้องหรือขาดหายอาจทำให้เกิดรีโลเคชันที่ผิดพลาดหรือไม่ถูกตรวจพบระหว่างการวิเคราะห์
- ⚠️ ตัวส่งออกไฟล์อ็อบเจ็กต์อาศัยผลลัพธ์จากตัววิเคราะห์ Relocation table synthesizer ควรรันตัววิเคราะห์นี้ก่อนส่งออกไฟล์อ็อบเจ็กต์ เพื่อให้แน่ใจว่าเนื้อหาของตารางรีโลเคชันเป็นข้อมูลล่าสุด
หลักการทำงาน
ไฟล์อ็อบเจ็กต์ประกอบด้วย 3 ส่วน:
- ไบต์ของเซกชันที่สามารถทำรีโลเคชันได้
- ตารางสัญลักษณ์
- ตารางรีโลเคชัน
เมื่อ linker สร้างไฟล์ปฏิบัติการจากไฟล์อ็อบเจ็กต์หลายไฟล์:
- จัดวางเซกชันลงในหน่วยความจำ
- คำนวณแอดเดรสของสัญลักษณ์ใน virtual address space
- ใช้รีโลเคชันกับไบต์ของเซกชันโดยอิงจากแอดเดรสสุดท้ายของสัญลักษณ์
โดยทั่วไป หลังจากกระบวนการนี้ ตารางรีโลเคชันจะถูกทิ้งไป และตารางสัญลักษณ์ก็มักถูกทิ้งเช่นกัน เว้นแต่จะคงสัญลักษณ์ดีบักไว้ อย่างไรก็ตาม ด้วยการวิเคราะห์อย่างรอบคอบ ข้อมูลเหล่านี้สามารถสร้างกลับขึ้นมาใหม่ได้ ซึ่งทำให้สามารถ delink โปรแกรมกลับเป็นไฟล์อ็อบเจ็กต์ได้อีกครั้ง
สรุปโดย GN⁺
- ส่วนขยาย Ghidra นี้ช่วยให้ส่งออกบางส่วนของโปรแกรมเป็นไฟล์อ็อบเจ็กต์ได้
- มีกรณีใช้งานหลากหลาย เช่น การแพตช์ไบนารีขั้นสูง การพอร์ตซอฟต์แวร์ และการแปลงรูปแบบไฟล์
- ต้องใช้ฐานข้อมูลที่แม่นยำ และควรรันตัววิเคราะห์ก่อนส่งออกไฟล์อ็อบเจ็กต์
- โครงการที่มีความสามารถคล้ายกันมีอย่างดีคอมไพเลอร์ เช่น IDA Pro
ยังไม่มีความคิดเห็น