Capture the Flag

Capture the Flag

by invalid

Tutorial ini adalah solusi versi windows untuk soal latihan kategori Hide and Seek dari Beginner Malware Reversing Challenges.

Persiapan


Berikut ini adalah beberapa tools yang digunakan pada tutorial ini:

Strings1


Untuk soal pertama yang nama filenya adalah strings1.exe_, ubah dulu nama filenya menjadi strings1.exe lalu jalankan. Akan muncul pesan seperti pada gambar berikut ini:

strings1 msgbox

Jika Anda membuka soal tersebut menggunakan notepad, maka akan terlihat ada banyak string FLAG, namun harus diperiksa satu persatu dengan terlebih dahulu menghitung hash MD5nya dan dibandingkan dengan hash yang terdapat pada pesan yang ditampilkan jika soal tersebut dijalankan:

strings1 in notepad

Menggunakan notepad bukanlah cara yang mudah untuk memperoleh flag. Anda dapat menggunakan Process Explorer buatan Sysinternals untuk melihat printable string pada soal tersebut:

strings1 in process explorer

Aplikasi lain buatan Sysinternals yang dapat Anda gunakan adalah strings yang outputnya dapat Anda arahkan ke perintah find lalu outputnya Anda simpan ke file:

strings1 using strings and find

Tutorial ini akan menggunakan cara terakhir, yaitu menggunakan aplikasi strings dari Sysinternals untuk mengekstrak string FLAG dan menyimpannya ke dalam file deadlisting.txt. Berikut ini adalah perintah yang digunakan:

strings strings1.exe_ | find /i "flag" > deadlisting.txt

Langkah selanjutnya adalah menggunakan script powershell untuk membaca setiap baris pada file deadlisting.txt dan menghitung hash MD5nya, lalu dibandingkan dengan hash yang benar. Jalankan powershell sebagai administrator dan gunakan perintah berikut ini agar script powershell nantinya dapat dieksekusi:

Set-ExecutionPolicy RemoteSigned

Tekan tombol y pada keyboard untuk membolehkan eksekusi script powershell. Setelah itu, salin script berikut ini dan simpan pada direktori yang sama dimana file deadlisting.txt berada:

$content = Get-Content "deadlisting.txt"

foreach($line in $content)
{
    $md5 = new-object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider
    $utf8 = new-object -TypeName System.Text.UTF8Encoding
    $hash = [System.BitConverter]::ToString($md5.ComputeHash($utf8.GetBytes($line))).ToLower() -replace '-', ''

    #$hash = $hash.ToLower() -replace '-', ''

    if ($hash -eq "4c827c4ca62781d707cd049da13539ee")
    {
        Write-Output $hash $line
        break
    }
}

Kembali ke aplikasi powershell, pindah ke direktori dimana file deadlisting.txt berada dan jalankan script yang telah disimpan tadi. Hasilnya adalah FLAG yang benar seperti pada gambar berikut ini:

strings1 flag

Strings2


Untuk soal kedua, yaitu strings2.exe_, kita akan menggunakan IDA. Terlebih dahulu ubah nama soal tersebut menjadi strings2.exe agar dapat dieksekusi, lalu jalankan. Akan muncul kotak pesan seperti ini:

strings2 msgbox

Selanjutnya, jalankan IDA dan buka soal tersebut. Berikut ini adalah tampilan disassembly fungsi start pada soal tersebut:

.text:004022B0 ; =============== S U B R O U T I N E =======================================
.text:004022B0
.text:004022B0 ; Attributes: noreturn bp-based frame
.text:004022B0
.text:004022B0                 public start
.text:004022B0 start           proc near
.text:004022B0
.text:004022B0 var_28          = byte ptr -28h
.text:004022B0 var_27          = byte ptr -27h
.text:004022B0 var_26          = byte ptr -26h
.text:004022B0 var_25          = byte ptr -25h
.text:004022B0 var_24          = byte ptr -24h
.text:004022B0 var_23          = byte ptr -23h
.text:004022B0 var_22          = byte ptr -22h
.text:004022B0 var_21          = byte ptr -21h
.text:004022B0 var_20          = byte ptr -20h
.text:004022B0 var_1F          = byte ptr -1Fh
.text:004022B0 var_1E          = byte ptr -1Eh
.text:004022B0 var_1D          = byte ptr -1Dh
.text:004022B0 var_1C          = byte ptr -1Ch
.text:004022B0 var_1B          = byte ptr -1Bh
.text:004022B0 var_1A          = byte ptr -1Ah
.text:004022B0 var_19          = byte ptr -19h
.text:004022B0 var_18          = byte ptr -18h
.text:004022B0 var_17          = byte ptr -17h
.text:004022B0 var_16          = byte ptr -16h
.text:004022B0 var_15          = byte ptr -15h
.text:004022B0 var_14          = byte ptr -14h
.text:004022B0 var_13          = byte ptr -13h
.text:004022B0 var_12          = byte ptr -12h
.text:004022B0 var_11          = byte ptr -11h
.text:004022B0 var_10          = byte ptr -10h
.text:004022B0 var_F           = byte ptr -0Fh
.text:004022B0 var_E           = byte ptr -0Eh
.text:004022B0 var_D           = byte ptr -0Dh
.text:004022B0 var_C           = byte ptr -0Ch
.text:004022B0 var_B           = byte ptr -0Bh
.text:004022B0 var_A           = byte ptr -0Ah
.text:004022B0 var_9           = byte ptr -9
.text:004022B0 var_8           = byte ptr -8
.text:004022B0 var_7           = byte ptr -7
.text:004022B0 var_6           = byte ptr -6
.text:004022B0 var_5           = byte ptr -5
.text:004022B0 var_4           = dword ptr -4
.text:004022B0
.text:004022B0                 push    ebp
.text:004022B1                 mov     ebp, esp
.text:004022B3                 sub     esp, 28h
.text:004022B6                 mov     [ebp+var_28], 46h
.text:004022BA                 mov     [ebp+var_27], 4Ch
.text:004022BE                 mov     [ebp+var_26], 41h
.text:004022C2                 mov     [ebp+var_25], 47h
.text:004022C6                 mov     [ebp+var_24], 7Bh
.text:004022CA                 mov     [ebp+var_23], 53h
.text:004022CE                 mov     [ebp+var_22], 54h
.text:004022D2                 mov     [ebp+var_21], 41h
.text:004022D6                 mov     [ebp+var_20], 43h
.text:004022DA                 mov     [ebp+var_1F], 4Bh
.text:004022DE                 mov     [ebp+var_1E], 2Dh
.text:004022E2                 mov     [ebp+var_1D], 53h
.text:004022E6                 mov     [ebp+var_1C], 54h
.text:004022EA                 mov     [ebp+var_1B], 52h
.text:004022EE                 mov     [ebp+var_1A], 49h
.text:004022F2                 mov     [ebp+var_19], 4Eh
.text:004022F6                 mov     [ebp+var_18], 47h
.text:004022FA                 mov     [ebp+var_17], 53h
.text:004022FE                 mov     [ebp+var_16], 2Dh
.text:00402302                 mov     [ebp+var_15], 41h
.text:00402306                 mov     [ebp+var_14], 52h
.text:0040230A                 mov     [ebp+var_13], 45h
.text:0040230E                 mov     [ebp+var_12], 2Dh
.text:00402312                 mov     [ebp+var_11], 42h
.text:00402316                 mov     [ebp+var_10], 45h
.text:0040231A                 mov     [ebp+var_F], 53h
.text:0040231E                 mov     [ebp+var_E], 54h
.text:00402322                 mov     [ebp+var_D], 2Dh
.text:00402326                 mov     [ebp+var_C], 53h
.text:0040232A                 mov     [ebp+var_B], 54h
.text:0040232E                 mov     [ebp+var_A], 52h
.text:00402332                 mov     [ebp+var_9], 49h
.text:00402336                 mov     [ebp+var_8], 4Eh
.text:0040233A                 mov     [ebp+var_7], 47h
.text:0040233E                 mov     [ebp+var_6], 53h
.text:00402342                 mov     [ebp+var_5], 7Dh
.text:00402346                 lea     eax, [ebp+var_28]
.text:00402349                 push    eax                      ; char *
.text:0040234A                 call    md5_hash(char *)         ; md5_hash()
.text:0040234F                 add     esp, 4
.text:00402352                 mov     [ebp+var_4], eax
.text:00402355                 push    30h
.text:00402357                 push    offset aWeVeBeenCompro   ; "We've been compromised!"
.text:0040235C                 mov     ecx, [ebp+var_4]
.text:0040235F                 push    ecx
.text:00402360                 push    0
.text:00402362                 call    ds:MessageBoxA
.text:00402368                 push    0
.text:0040236A                 call    ds:ExitProcess
.text:0040236A start           endp

Bisa terlihat bahwa, sejumlah instruksi pada fungsi tersebut menyimpan byte ke stack lalu menghitung hash MD5nya. Kita akan menggunakan powershell untuk mengubah deretan byte dalam bentuk hexadesimal tersebut menjadi FLAG yang benar. Berikut ini adalah perintah yang digunakan:

[System.Net.WebUtility]::UrlDecode("%46%4C%41%47%7B%53%54%41%43%4B%2D%53%54%52%49%4E%47%53%2D%41%52%45%2D%42%45%53%54%2D%53%54%52%49%4E%47%53%7D")

Hasilnya adalah seperti ini:

strings2 flag

Strings3


Soal strings3.exe_ hampir sama dengan soal strings1.exe_, namun kali ini FLAG tersimpan dengan diantarai oleh satu karakter acak. Berikut ini adalah tampilan deretan FLAG tersebut jika ditampilkan menggunakan aplikasi strings dari Sysinternals:

strings3 strings

Tidak masalah, kita akan menyimpan deretan FLAG tersebut ke dalam file yang diberi nama deadlisting.txt menggunakan perintah berikut ini:

strings strings3.exe_ | find /i "flag" > deadlisting.txt

Selanjutnya gunakan teks editor (pada tutorial ini digunakan SublimeText) untuk menghilangkan karakter acak diantara setiap FLAG:

strings3 flag cleaning

Setelah itu, kita akan menggunakan kembali script powershell untuk menemukan flag pada soal pertama, namun kali ini mengubah nilai hash MD5 pada script tersebut. Berikut ini adalah script yang digunakan untuk soal strings3.exe_:

$content = Get-Content "deadlisting.txt"

foreach($line in $content)
{
    $md5 = new-object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider
    $utf8 = new-object -TypeName System.Text.UTF8Encoding
    $hash = [System.BitConverter]::ToString($md5.ComputeHash($utf8.GetBytes($line))).ToLower() -replace '-', ''

    #$hash = $hash.ToLower() -replace '-', ''

    if ($hash -eq "1011cafbd736cdf2ae90964613c911fe")
    {
        Write-Output $hash $line
        break
    }
}

Jalankan script tersebut, maka hasilnya adalah flag yang valid, yaitu FLAG{RESOURCES-ARE-POPULAR-FOR-MALWARE}.

Demikianlah tutorial singkat ini, semoga bermanfaat. Terima kasih kepada Tuhan Yang Maha Esa, dan Anda yang telah membaca tutorial ini.

Mantap bro buat Windows tutorialnya, btw kalo IDAPro buat Linux yang sebagus di Windows ada gak om ? UI/UX-nya

Kalau saya, biasanya jalanin IDAPro pakai wine di Linux om, soalnya ga punya IDAPro versi Linux. Tapi sekarang saya lebih sering pakai radare2 kalau di Linux. Mungkin bisa coba Hopper kalau untuk UI/UX yang mirip IDAPro.