Pada artikel ini kita akan berurusan dengan mendekompilasi biner MIPS di Ghidra dan membalikkan program yang ditulis dalam golang di IDA.
Bagian 1 - C, C ++ dan DotNet mendekompilasi.Informasi OrganisasiTerutama bagi mereka yang ingin mempelajari sesuatu yang baru dan berkembang di bidang informasi dan keamanan komputer, saya akan menulis dan berbicara tentang kategori berikut:
- PWN;
- kriptografi (Crypto);
- teknologi jaringan (Jaringan);
- membalikkan (Reverse Engineering);
- steganografi (Stegano);
- pencarian dan eksploitasi kerentanan WEB.
Selain itu, saya akan membagikan pengalaman saya dalam forensik komputer, analisis malware dan firmware, serangan pada jaringan nirkabel dan jaringan area lokal, melakukan pentest dan menulis eksploitasi.
Agar Anda dapat mengetahui tentang artikel baru, perangkat lunak, dan informasi lainnya, saya membuat
saluran di Telegram dan
grup untuk membahas masalah apa pun di bidang ICD. Juga, saya pribadi akan mempertimbangkan permintaan pribadi Anda, pertanyaan, saran dan rekomendasi
secara pribadi dan akan menjawab semua orang .
Semua informasi disediakan hanya untuk tujuan pendidikan. Penulis dokumen ini tidak bertanggung jawab atas kerusakan yang disebabkan seseorang sebagai akibat dari menggunakan pengetahuan dan metode yang diperoleh sebagai hasil dari mempelajari dokumen ini.
ELF MIPS

Unduh dan periksa file.

Ini adalah file eksekusi 32-bit untuk prosesor arsitektur MIPS. Untuk mengatasi masalah ini, kami akan menggunakan Ghidra. Buka hydra, buat proyek baru dan tambahkan ke file yang dapat dieksekusi.

Sekarang buka file yang diselidiki, dan pindah ke jendela Symbol Tree. Dalam pencarian, ketik utama untuk menemukan titik masuk program.

Ketika Anda memilih fungsi, itu segera terbuka di dekompiler.

Mari kita konversi kodenya.

Kita melihat bahwa 64 byte dibaca ke dalam variabel local_54, mari kita ganti namanya menjadi input (hotkey L) dan buat array karakter 64-karakter darinya (hotkey Ctrl + L). Anda juga dapat mengganti nama variabel sVar1.


Setelah beberapa konversi, kode mulai terlihat sedikit lebih indah.

Kami menganalisis kodenya. String yang kita masukkan harus sepanjang 19 karakter. Pada posisi apa karakter harus jelas dari kode. Dalam hal ini, dari tanggal 8 hingga tanggal 17 harus menjadi simbol 'i'. Kami memulihkan, meneruskan kata sandi.
Golang dasar

Dalam tugas ini, kami diberikan file yang dapat dieksekusi yang ditulis dalam Go. Anda bahkan dapat mengetahui versi mana. Saya melempar IDA. Harus segera dikatakan bahwa fungsi utama tidak disebut main, tetapi disebut main_main. Karena itu, kami melakukan pencarian berdasarkan fungsi dan pergi ke yang utama sebenarnya.

Mari kita uraikan kodenya. Mari kita mulai dari awal.

Ada definisi a, kunci, input. Blok kiri bertanggung jawab untuk menyelesaikan fungsi main_main. Pertimbangkan blok kiri.

Fungsi fmt_Scanln dirancang untuk membaca baris dari konsol. Kami juga mengamati data main_statictmp_2 yang sudah disimpan dalam program.

Selanjutnya, fungsi runtime_stringtoslicebyte dipanggil, sesuai dengan kode, kita dapat mengasumsikan bahwa dibutuhkan 6 byte pertama dari baris berikutnya.

Key.ptr akan menunjuk ke awal slice ini. Mari kita lihat apa yang terjadi selanjutnya.

Bergantung pada perbandingan register r9 yang dibatalkan dan register rsi, di mana panjang input pengguna berada. Dari sini kita dapat menyimpulkan bahwa r9 kemungkinan besar akan menjadi penghitung. Mari kita lihat blok yang tepat, ke mana kontrol akan pergi, setelah penjualan pada baris yang kita masukkan.

Fungsi bytes_Compare disebut, yang, tergantung pada hasil perbandingan, menampilkan salah satu baris.


Kami mengetahui output dari program, sekarang mari kita lihat jeda baris (di cabang kiri).

Karakter dari input pengguna dimasukkan ke dalam register r10, dan kemudian ada banyak kode kompleks untuk perbandingan untuk mengontrol pengecualian seperti panic divide dan panic index. Saya menyoroti cabang pelaksanaan program.

Jadi, byte dari string yang ditentukan secara statis ditempatkan di EDX dan bertengkar dengan r10, di mana byte dari slice. Selanjutnya, counter r9 meningkat. Dua blok yang berdekatan di tengah kemungkinan besar dibutuhkan untuk mengontrol panjang potongan.
Mari kita gabungkan semuanya: garis yang dimasukkan terkontaminasi dengan irisan dan dibandingkan dengan garis yang ditentukan secara statis. Mari proksi untuk mengetahui kata sandi yang benar.

Kami mendapat jawabannya. Kompleksitas dari kebalikan dari binari Go adalah bahwa ada faktor-faktor rumit seperti tidak adanya karakter nol di akhir baris, penyajian tipenya, pengumpul sampah, dll.
Itu saja untuk saat ini. Untuk dilanjutkan ... Anda dapat bergabung dengan kami di
Telegram . Di sana Anda dapat mengusulkan topik Anda sendiri dan memilih pilihan topik untuk artikel-artikel berikut.