Script untuk memulihkan definisi string di Binari GO dengan analisis P-code. Diuji dengan x86, x86-64, ARM, dan ARM64.
Ini dapat ditemukan dalam kategori Golang di manajer skrip.
GoDynamicStrings.javaGoFuncCallStrings.javaGoStaticStrings.javaGoKnownStrings.javadata/known_strings.json .GoStringFiller.javago.string.* Setelah analisis awal, berdasarkan urutan panjang naik data string.Ada juga beberapa variasi khusus dari skrip analisis string dinamis:
GoDynamicStringsSingle.javaGoDynamicStrings.java , tetapi menggunakan proses penguraian tunggal. Gunakan ini jika menganalisis biner menyebabkan proses dekompiler paralel ke memori sistem buang.GoDynamicStringsHigh.javaIni dapat ditemukan dalam kategori PCODE di manajer skrip.
PrintHighPCode.javaBerikut aliran umum untuk menggunakan skrip ini untuk memulihkan definisi string dalam biner go:
.rodata , .rdata , atau __rodata . Kemudian klik kanan dalam daftar kode dan pilih "Hapus Bytes Kode".GoKnownStrings.java untuk mendeteksi beberapa string standar.GoStaticStrings.java .GoFuncCallStrings.java (jika versi biner Golang didukung oleh fitur Golang bawaan Ghidra) .GoDynamicStrings.java .GoStringFiller.java .go.string.* Pada string byte satu pertama.go.string.* , Dan tentukan string apa pun dengan titik awal dan akhir yang jelas.GoStringFiller.java yang paling banyak, identifikasi di mana panjang string berubah dalam data string yang tidak terdefinisi dan tentukan string yang paling dekat dengan batas itu. Kemudian menjalankan kembali GoStringFiller.java untuk secara otomatis mengisi bintik-bintik di mana ia dapat dengan benar menentukan panjang string yang tidak terdefinisi dengan benar.Di Ghidra:
Untuk Eclipse dengan plugin Ghidradev:
Bangun dengan Eclipse:
Bangun langsung dengan Gradle:
$ cd Ghostrings
$ gradle -PGHIDRA_INSTALL_DIR= < ghidra_install_dir > Masalah terkenal dengan program Reverse Engineering GO adalah bahwa kurangnya terminator nol dalam string GO membuat definisi string yang pulih dari biner yang dikompilasi menjadi sulit. Banyak nilai string konstan program GO disimpan bersama dalam satu gumpalan raksasa dalam build yang dikompilasi, tanpa karakter terminator yang dibangun ke dalam data string untuk menandai di mana satu string berakhir dan yang lain dimulai. Bahkan program sederhana yang hanya mencetak "Hello World!" memiliki lebih dari 1.500 string di dalamnya terkait dengan sistem runtime go dan perpustakaan standar lainnya. Hal ini dapat menyebabkan implementasi penemuan string ASCII yang khas, seperti yang disediakan oleh Ghidra, untuk membuat definisi string positif palsu yang panjangnya puluhan ribu karakter.
Alih -alih string yang diakhiri nol, GO menggunakan struktur string yang terdiri dari pointer dan nilai panjang. Banyak dari struktur string ini dibuat pada tumpukan program saat runtime, sehingga memulihkan lokasi start string individual dan nilai panjang membutuhkan menganalisis kode mesin yang dikompilasi. Ada beberapa skrip yang ada yang melakukan analisis ini dengan memeriksa pola tertentu dari instruksi x86-64, tetapi mereka kehilangan struktur yang dibuat dengan variasi instruksi yang tidak ditangani yang pada akhirnya memiliki efek yang sama pada tumpukan, dan mereka juga terbatas pada ISA tertentu.
Ghostrings menghindari kedua masalah ini dengan bekerja dengan operasi p-code independen arsitektur yang disederhanakan yang diproduksi oleh analisis dekompiler Ghidra.
Hak Cipta 2022 NCC Group. Dirilis di bawah lisensi GPLV3 (lihat lisensi).
Penulis Proyek Utama: James Chambers [email protected]