Не важно, как медленно ты продвигаешься, главное, что ты не останавливаешься.


Monday 21 August 2017

Compfest 9 Reverse : Not So Classic String Validator



Kategori : Reverse Engineer
File : validator

Cek File:



Alur Program:



IDAPro Pseudocode:


.data section

dxdiag [] merupakan kumpulan dari magic number yang disimpan didalam .data section, cukup merepotkan jika harus mengumpulkannya secara manual. Dengan bantuan IDAPython kami mencoba untuk mengekstract .data section untuk dikumpukan menjadi array yang bisa diolah.

import idautils
import idaapi

start = idaapi.get_segm_by_name(".data").startEA
end = idaapi.get_segm_by_name(".data").endEA
data = []

while start<end:
    b = idc.Dword(start)
    data.append(b)
    start += 8
    
print data

elemen array diatas masih ada yang bernilai 0, karena pada kode ini start dan end merupakan alamat awal dan akhir .data section, untuk di kode selanjutnya start dan end dapat disesuaikan dengan alamat dari dxdiag.

The logic

variable :
s = input password
v6 = integer constant
v8 = panjang string s
v4 = formula magic number
dxdiag [] = array magic number

Pengecekan yang dilakukan oleh validator ini ada 2 kondisi,
yang pertama panjang dari password (s) yang diinput harus berjumlah 46 karakter,
yang kedua hasil perhitungan magic number (v4) harus sama dengan magic number yang ada pada array dxdiag.

flag yang benar akan muncul apabila syarat diatas terpenuhi.

yang menarik adalah array dari kumpulan magic number yang berada pada .data section, jika karakter yang dimasukkan dengan kombinasi int constant yang benar, maka akan memunculkan karakter yang bisa dibaca.

Brute Force

Cara yang mungkin dilakukan adalah dengan menebak kombinasi karakter dengan integer constant sehingga menghasilkan kondisi yang sesuai dengan magic number yang disembunyikan.

Ada 2 tahap bruteforce yang dilakukan, yaitu:
1. Brute force karakter (0-255)
2. Brute force bilangan integer (yang besarnya tidak diketahui, untuk percobaan kami coba sampai dengan 5000)

Berikut ini adalah kode yang mencoba bruteforce karakter pertama dari password yang valid:
import idautils
import idaapi
import math

start = 0x601080
end = 0x6011EF
data = []
while start<end:
    b = idc.Dword(start)
    data.append(b)
    start += 8
print "-------------------"
for i in range(1,256):
    for j in range(1,5000):
        try:
            v4 = math.exp(i * 13.0 / j)
        except OverflowError:
            v4 = float('inf')
        if math.floor(v4) == data[0]:
            print chr(i),j 

hasil :
-------------------
n 97
Ü 194
dari hasil brute force didapatkan angka dari integer konstan yang valid adalah 97 dan 194, namun yang menampilkan hasil yang valid adalah 97

Final Code

Setelah mendapat integer konstan yang valid, maka langkah selanjutnya adalah brute force karakter dari setiap password dengan nilai integer konstan bernilai 97.
import idautils
import idaapi
import math

start = 0x601080
end = 0x6011EF
angka = 97 #hasil bruteforce
data = []
result = ''
while start<end:
    b = idc.Dword(start)
    data.append(b)
    start += 8
print "-------------------"
for j in range(0,46):
    for i in range(1,256):
        try:
            v4 = math.exp(i * 13.0 / angka)
        except OverflowError:
            v4 = float('inf')
        if math.floor(v4) == data[j]:
            result += chr(i)
print result 
hasil :
-------------------
naTur4l_NumB3r_is_th3_beSt_stRiNg_ch3ckEr_evEr

Sudah terlihat jelas string dari password yang ada pada validator, untuk memastikan bisa dimasukkan kedalam validatornya.

5 λ .: August 2017 Kategori : Reverse Engineer File :  validator Cek File: Alur Program: IDAPro Pseudocode: .data section dxdiag [] merupa...
< >