Pada fungi main__Credential_validate dilakukan pengecekan panjang hostname kita, kemudian dilakukan hash dengan algoritma crc32 untuk per 4 byte nya
for ( i = 0; i < v58; ++i )
{
v34 = *(_DWORD *)(4LL * i + v57);
for ( j = 0; j < v58; ++j )
{
v32 = *(_DWORD *)(4LL * j + v57);
if ( v34 != v32 )
{
v31 = v32 + v34;
v74 = &v11;
memmove_plt(&v11, &v49, 32LL);
result = (_DWORD *)array_get(v50, (unsigned __int64)&v49, v6, v7, v8);
if ( v31 != *result )
return result;
++v50;
}
}
}
Selanjutnya dilakukan penambahan untuk nilai index yang tidak sama ( i!=j ) dan dilakukan pengecekan dengan hardcode value pada binary. Jadi disini kami lakukan extract terhadap hardcode tersebut lalu gunakan z3 untuk mendapatkan nilai dari crc32 flag per 4 byte , untuk mendapatkan plaintext lakukan bruteforce.
from z3 import *
# dump = ['13e3e974', 'b8fb8dd0', 'ba94a470', '13e3e974', '5e07e4c0', '5fa0fb60', 'b8fb8dd0', '5e07e4c0', '4b89fbc', 'ba94a470', '5fa0fb60', '4b89fbc']
flag = [BitVec(f"flag_{i}", 64) for i in range(4)]
s = Solver()
s.add(flag[0]+flag[1] == 0x113e3e974)
s.add(flag[0]+flag[2] == 0xb8fb8dd0)
s.add(flag[0]+flag[3] == 0xba94a470)
s.add(flag[1]+flag[2] == 0x5e07e4c0)
s.add(flag[1]+flag[3] == 0x5fa0fb60)
s.add(flag[2]+flag[3] == 0x4b89fbc)
s.check()
model = s.model()
res = []
for i in flag:
res.append(model[i].as_long())
print(res)
Selanjutnya bruteforce, disini kami menggunakan pypy untuk mempercepat proses bruteforce
import string
from itertools import product
import zlib
flag = [3077294402, 1551376434, 26199182, 53009198]
list_str = string.uppercase + string.lowercase + string.digits
res = [0]*4
cnt = 0
for i in product(string.printable[:-6],repeat=4):
tmp = zlib.crc32(i[0]+i[1]+i[2]+i[3])
tmp = tmp&0xffffffff
if(tmp in flag):
res[flag.index(tmp)] = i[0]+i[1]+i[2]+i[3]
if(0 not in res):
break
print ''.join(res)
Untuk mendapatkan flag disini kami lakukan write saja ke memory
Flag : MDT4.0{700fc9fb1e75a6e9af24041d0ca0e205f4719a4f}
WeirdChamp (691 pts)
Description
-
Solution
Diberikan file exe yang cukup berat, dibuat dengan F# . Disini kami menggunakan dnspy untuk melakukan decompile terhadap file exe tersebut
Tentunya setelah menunggu cukup lama akhirnya kami mendapatkan full source codenya , berikut untuk full source codenya
Disini kami kesulitan karena tidak dapat menjalankan filenya namun setelah kami analisis ternyata pada setiap function yang didefinisikan terdapat pemanggilan fungsi print , yang melakukan print “L” . Karena saat kami lihat terdapat tail head , seperti 2 mata koin , dan ada print huruf “L” maka kami simpulkan bahwa L bermakna LOSE , dan ada fungsi yang melakukan print “W” yang bermakna WIN . Jadi kami coba cari fungsi yang melakukan print “W” , dan ternyata ADA.
Karena diawal terlihat bahwa fungsi ini melakukan pemanggilan fungsi lain secara rekursif maka disini kami sama saja dengan melakukan rekursif secara reverse ( dari child ke parent ). Disini kami mendapatkan keseluruhan flagnya secara manual :) . Tinggal search search aja untuk nama fungsinya
Kemudian tinggal gabungkan dari bawah ke atas atau atas ke bawah lalu reverse dan diapatkan flagnya.