สคริปต์สำหรับการกู้คืนคำจำกัดความของสตริงใน Binaries GO ด้วยการวิเคราะห์ P-Code ทดสอบด้วย X86, X86-64, ARM และ ARM64
สิ่งเหล่านี้สามารถพบได้ในหมวดหมู่ Golang ในตัวจัดการสคริปต์
GoDynamicStrings.javaGoFuncCallStrings.javaGoStaticStrings.javaGoKnownStrings.javadata/known_strings.jsonGoStringFiller.javago.string.* หลังจากการวิเคราะห์เบื้องต้นขึ้นอยู่กับลำดับความยาวจากน้อยไปมากของข้อมูลสตริงนอกจากนี้ยังมีรูปแบบพิเศษสองสามแบบของสคริปต์การวิเคราะห์สตริงแบบไดนามิก:
GoDynamicStringsSingle.javaGoDynamicStrings.java แต่ใช้กระบวนการ decompiler เดียว ใช้สิ่งนี้หากการวิเคราะห์ไบนารีทำให้กระบวนการ decompiler แบบขนานกับหน่วยความจำระบบไอเสียGoDynamicStringsHigh.javaสามารถพบได้ในหมวดหมู่ PCODE ในตัวจัดการสคริปต์
PrintHighPCode.javaนี่คือโฟลว์ทั่วไปสำหรับการใช้สคริปต์เหล่านี้เพื่อกู้คืนคำจำกัดความของสตริงใน GO Binary:
.rodata , .rdata หรือ __rodata จากนั้นคลิกขวาในรายการรหัสและเลือก "ล้างรหัสไบต์"GoKnownStrings.java เพื่อตรวจจับสตริงมาตรฐานบางอย่างGoStaticStrings.javaGoFuncCallStrings.java (หากรุ่น Golang Binary ได้รับการสนับสนุนโดยคุณสมบัติ Golang ในตัวของ Ghidra)GoDynamicStrings.javaGoStringFiller.javago.string.* ที่สตริงแรกไบต์go.string.* และกำหนดสตริงใด ๆ ที่มีจุดเริ่มต้นและจุดสิ้นสุดที่ชัดเจนGoStringFiller.java มากที่สุดให้ระบุความยาวของสตริงที่เปลี่ยนแปลงไปในข้อมูลสตริงที่ไม่ได้กำหนดและกำหนดสตริงที่อยู่ใกล้กับขอบเขตนั้น จากนั้นเรียกใช้ GoStringFiller.java อีกครั้งเพื่อเติมเต็มจุดที่สามารถกำหนดความยาวของสตริงที่ไม่ได้กำหนดได้อย่างถูกต้องใน Ghidra:
สำหรับ Eclipse ด้วยปลั๊กอิน Ghidradev:
สร้างด้วย Eclipse:
สร้างโดยตรงกับ Gradle:
$ cd Ghostrings
$ gradle -PGHIDRA_INSTALL_DIR= < ghidra_install_dir > ปัญหาที่รู้จักกันดีเกี่ยวกับโปรแกรม GO ทางวิศวกรรมย้อนกลับคือการขาดเทอร์มินัลโมฆะในสาย GO ทำให้การกู้คืนคำจำกัดความของสตริงจากไบนารีที่รวบรวมได้ยาก ค่าสตริงคงที่ของโปรแกรม GO จำนวนมากจะถูกเก็บไว้ด้วยกันในหยดยักษ์ตัวหนึ่งในการบิลด์ที่รวบรวมโดยไม่มีอักขระเทอร์มิเนเตอร์ใด ๆ ที่สร้างไว้ในข้อมูลสตริงเพื่อทำเครื่องหมายว่าสตริงหนึ่งสิ้นสุดลง แม้แต่โปรแกรมง่ายๆที่เพิ่งพิมพ์ "Hello World!" มีสตริงมากกว่า 1,500 สตริงที่เกี่ยวข้องกับระบบรันไทม์ GO และไลบรารีมาตรฐานอื่น ๆ สิ่งนี้สามารถทำให้การใช้งานการค้นพบสตริง ASCII ทั่วไปเช่นที่ Ghidra จัดทำขึ้นเพื่อสร้างคำจำกัดความสตริงบวกที่ผิดพลาดซึ่งมีความยาวหลายหมื่นอักขระ
แทนที่จะเป็นสตริง Null ที่สิ้นสุดให้ใช้โครงสร้างสตริงที่ประกอบด้วยตัวชี้และค่าความยาว โครงสร้างสตริงเหล่านี้จำนวนมากถูกสร้างขึ้นบนสแต็กของโปรแกรมที่รันไทม์ดังนั้นการกู้คืนตำแหน่งสตริงเริ่มต้นและค่าความยาวจำเป็นต้องวิเคราะห์รหัสเครื่องที่รวบรวม มีสคริปต์ที่มีอยู่สองสามสคริปต์ที่ดำเนินการวิเคราะห์นี้โดยการตรวจสอบรูปแบบบางอย่างของคำแนะนำ x86-64 แต่พวกเขาพลาดโครงสร้างที่สร้างขึ้นด้วยคำแนะนำที่ไม่มีการจัดการซึ่งในที่สุดก็มีผลเช่นเดียวกันกับสแต็ก
Ghostrings หลีกเลี่ยงปัญหาทั้งสองนี้โดยการทำงานกับการดำเนินงาน P-Code ที่เป็นอิสระสถาปัตยกรรมที่ผลิตโดยการวิเคราะห์ decompiler ของ Ghidra
ลิขสิทธิ์ 2022 กลุ่ม NCC ปล่อยภายใต้ใบอนุญาต GPLV3 (ดูใบอนุญาต)
ผู้เขียนโครงการหลัก: James Chambers [email protected]