Coconut CTF: Medium Win32

From Indonesian Research And Development Center
Jump to: navigation, search

Pada misi ini, peserta dihadapkan dengan aplikasi yang dibuat menggunakan Visual Basic, dimana user harus melakukan transfer menggunakan identitas yang tepat. Hal yang perlu diperhatikan pada misi ini adalah peserta harus menggunakan nama Edi Tansil seperti yang terlihat pada potongan disassembly berikut ini:

.text:0040666E             mov     edx, offset aEdiTansil   ; edx = "Edi Tansil"

Adapun perhitungan nilai PIN yang valid terdapat pada bagian disassembly berikut ini:

.text:004067C4             movsx   ecx, word ptr [esi+3Ch]  ; ecx = 0x2759 (10073) <<< PIN
.text:004067C8             mov     [ebp-0CCh], ecx          ;
.text:004067CE             fild    dword ptr [ebp-0CCh]     ;\
.text:004067D4             fstp    qword ptr [ebp-0D4h]     ; \ FPU
.text:004067DA             fcomp   qword ptr [ebp-0D4h]     ; / stuff
.text:004067E0             fnstsw  ax                       ;/
.text:004067E2             test    ah, 40h                  ;
.text:004067E5             jz      short loc_4067EE         ;
.text:004067E7             mov     eax, 1                   ;
.text:004067EC             jmp     short loc_4067F0         ;
.text:004067EE ; ---------------------------------------------------------------------------
.text:004067EE
.text:004067EE loc_4067EE:                                  ; CODE XREF: .text:004067E5
.text:004067EE             xor     eax, eax                 ; eax = 0
.text:004067F0
.text:004067F0 loc_4067F0:                                  ; CODE XREF: .text:004067EC
.text:004067F0             neg     eax                      ;
.text:004067F2             lea     ecx, [ebp-18h]           ;
.text:004067F5             mov     edi, eax                 ;
.text:004067F7             call    ds:__vbaFreeStr          ;
.text:004067FD             lea     ecx, [ebp-34h]           ;
.text:00406800             call    ds:__vbaFreeObj          ;
.text:00406806             cmp     di, bx                   ;
.text:00406809             jz      loc_40698E               ; ***** BAD BOY *****

Jika Anda melakukan debugging, maka PIN yang valid dapat Anda lihat pada register ECX di alamat 0x004067C4 yang nilainya adalah 0x2759 (hexadesimal) atau 10073 desimal. Setelah memasukkan PIN tersebut, maka title bar aplikasi akan menampilkan string flag, yaitu zXd201430219eRz. Flag tersebut dihitung dengan menggunakan formula:

"zXd" + tahun + (((tahun * 5) + 3) * 3) + "eRz"

Berikut ini adalah potongan disassembly yang memperlihatkan proses pengambilan nilai tahun:

.text:004066A5             lea     edx, [ebp-44h]           ;
.text:004066A8             push    edx                      ;
.text:004066A9             call    ds:rtcGetPresentDate     ; rtcGetPresentDate(edx)
.text:004066AF             lea     eax, [ebp-44h]           ;
.text:004066B2             lea     ecx, [ebp-54h]           ;
.text:004066B5             push    eax                      ;
.text:004066B6             push    ecx                      ;
.text:004066B7             call    ds:rtcGetYear            ; rtcGetYear(ecx, eax)

Setelah itu, nilai dari tahun saat ini akan dihitung dengan menggunakan formula ((tahun * 5) + 3) * 3. Jadi untuk tahun 2014, formula tersebut akan menjadi ((2014 * 5) + 3) * 3 = 30219 seperti yang bisa dilihat pada potongan disassembly berikut ini:

.text:004066DB             mov     ax, [esi+40h]            ; ax = var_year
.text:004066DF             add     esp, 0Ch                 ;
.text:004066E2             imul    ax, 5                    ; var_year *= 5
.text:004066E6             jo      loc_406C90               ; jump if overflow loc_406C90
.text:004066EC             add     ax, 3                    ; var_year += 3
.text:004066F0             lea     ecx, [esi+44h]           ; ecx =
.text:004066F3             jo      loc_406C90               ; jump if overflow loc_406C90
.text:004066F9             mov     [esi+3Ch], ax            ; [esi+3Ch] = var_year
.text:004066FD             imul    ax, 3                    ; var_year *= 3
.text:00406701             jo      loc_406C90               ; jump if overflow loc_406C90