Baby RE
HackTheBox Reversing Challenge
Baby RE adalah soal CTF kategori Reversing dengan tingkat kesulitan Easy. Soal ini dibuat oleh Xh4H dan telah dirilis pada 26 Oktober 2019.
Berikut adalah deskripsi dari tantangan ini:
Show us your basic skills! (P.S. There are 4 ways to solve this, are you willing to try them all?)
Introduction
Setelah mengesktrak archive soal, saya menemukan satu file bernama baby.
β ls -lah
total 36K
drwxrwxr-x 3 kali kali 4.0K Mar 1 03:48 .
drwxrwxr-x 4 kali kali 4.0K Mar 1 03:36 ..
-rw-rw-r-- 1 kali kali 17K Oct 13 2019 baby
β file baby
baby: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=25adc53b89f781335a27bf1b81f5c4cb74581022, for GNU/Linux 3.2.0, not strippedFile ini merupakan ELF 64-bit LSB pie executable yang merupakan file executable Linux.
Ketika saya menjalankan program ini, saya diminta untuk menginputkan key. Jika saya menginputkan sembarang teks, misalnya "test", program akan menampilkan pesan "Try again later" lalu berhenti. Hal ini menunjukkan bahwa program hanya menerima key yang valid.
β chmod +x baby
β ./baby
Insert key:
test
Try again later.Proof of Concept
Pada deskripsi soal dinyatakan bahwa ada empat cara untuk menyelesaikan soal ini. Namun, saya hanya akan membahas tiga cara, sesuai dengan walkthough resmi yang juga hanya mencakup tiga metode, yaitu:
Menggunakan
strings.Melakukan analisis dinamis menggunakan
ltrace.Menggunakan decompiler.
1. Menggunakan strings
Tantangan ini meminta saya untuk mendapatkan key yang valid agar bisa mendapatkan flag. Langkah sederhana yang bisa saya lakukan adalah menggunakan strings untuk mencoba menemukan key pada file biner.
Hasilnya, saya menemukan beberapa string yang menarik pada file baby, seperti:
Terdapat potongan flag di sini:
Terdapat string "
abcde122313" di antara "Insert Key" dan "Try again later". Saya menduga ini adalah key yang dikomparasikan dengan inputan pengguna. Jika inputan salah, program akan menampilkan pesan "Try again later".
Dari hasil analisis ini, saya mencoba menginputkan "abcde122313" sebagai key, dan hasilnya program menampilkan flag.
2. Analisis dinamis dengan ltrace
Berdasarkan pengalaman saya, umumnya perbandingan input yang valid atau tidak menggunakan pengkondisian seperti if. Pada program yang ditulis dalam bahasa C, fungsi untuk membandingkan string adalah strcmp().
Untuk mengetahui apakah program menggunakan fungsi strcmp(), saya mencoba menjalankan perintah ltrace.
Saya mencoba menjalankan ltrace pada program baby:
Ketika saya menginputkan "test", ltrace mendeteksi bahwa program melakukan pemanggilan fungsi berikut:
Kode ini membandingkan input pengguna dengan "abcde122313", yang ternyata adalah key yang valid untuk mendapatkan flag.
3. Analisis statik dengan decompiler
Dekompilasi Ghidra menghasilkan fungsi main() seperti berikut:
Dari sini, sebenarnya kita sudah mengetahui jawabannya. Perbandingan antara inputan dan key terdapat pada baris kode berikut:
Analisis Kode
Meskipun saya sudah mendapatkan jawaban dari tantangan ini, saya ingin menganalisis hasil dekompilasi tersebut lebih dalam untuk mempelajarinya secara lebih detail.
Deklarasi variabel
Mari kita identifikasi masing-masing variabel:
iVar1
int
Variabel untuk menyimpan hasil dari strcmp().
local_48, local_40, local_38, local_34
undefined8, undefined4, undefined2
Berisi bagian dari flag.
local_28
char array
Variabel untuk menyimpan input dari pengguna.
local_10
char *
Menyimpan string yang tidak pernah ditampilkan (tersembunyi).
Membandingkan input pengguna dengan key
Fungsi
strcmp()membandingkan input pengguna dengan"abcde122313\n". Jika cocok, nilai yang akan dikembalikan bernilai 0.Hasil perbandingan tersebut akan disimpan dalam variabel
iVar1.
Jika input benar, flag ditampilkan
if (iVar1 == 0)Jika variabel
iVar1bernilai 0, maka flag akan ditampilkan.
Penjelasan flag:
Flag dipecah menjadi 4 bagian, setiap bagian memiliki kapasitas maksimal 8 byte.
Hal ini terjadi karena arsitektur CPU 64-bit (x86-64) lebih efisien membaca data dalam unit 64-bit (8 byte).
Little Endian (dibalik)
CPU x86-64 menggunakan Little Endian, sehingga data hex yang tersimpan di memori harus dibalik agar terbaca dengan benar.
0x594234427b425448
"YB4B{BTH"
"HTB{B4BY"
0x3448545f5633525f
"4HT_VER_"
"_REV_TH4"
0x455f5354
"E_ST"
"TS_E"
0x7d5a
"}Z"
"Z}"
Berikut adalah jika pseudocode tersebut ditulis ulang ke dalam kode C yang lebih readable:
Last updated