Diatas merupakan screenshot pseucode assembly main function dari file simplex . Mari kita sedikit melihat lebih dalam apa yang di lakukan pada fungsi ini.
- fwrite(0x400a4f, 0x1, 0x19, var_38); merupakan penambahan header "=== OWNED_BY_SIMPLEX ===\n" pada hasil enkripsi.
- Kemudian di lakukan looping sampai byte di dalam file asli habis. Kemudian per byte di lakukan operasi subtitusi dengan 105 sebanyak 5x.
- Kemudian di tambahkan dengan char padding \m/(~_^)\m/
- Dan di tambahkan footer "\n=== END_OF_SIMPLEX ===\n".
Dan file flagnya di lakukan enkripsi sebanyak ekstensi "gksk" dan jumlah ekstensinya sebanyak 3 buah berarti kita harus melakukan dekripsi sebanyak 3x untuk mendapatkan flagnya. Script dibawah akan menjawab semua tantangan ini.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import sys, re | |
def main(): | |
filename = sys.argv[1] | |
chipers_gksk = open(filename, "r").read() | |
split_gksk = filename.split(".") | |
the_real_flag = "" | |
chiper = chipers_gksk | |
while True: | |
if "gksk" not in split_gksk: | |
break | |
chiper.replace("=== OWNED_BY_SIMPLEX ===\n", "").replace("\n=== END_OF_SIMPLEX ===\n", "") | |
tmp_chiper = "" | |
for c in chiper: | |
s = ord(c) | |
for i in range(0, 5): | |
s = ( s - 0x69) & 0xff | |
tmp_chiper += chr(s) | |
chiper = tmp_chiper | |
split_gksk.pop() | |
regx = re.search(r'GKSK{([a-zA-Z_]+)}', chiper) | |
print "Flag is : ", regx.group(0) | |
if __name__ == '__main__': | |
main() |
Cara penggunaanya python simplex-decode.py flag.gksk.gksk.gksk . Cara kerja script ini seperti di bawah ini.
- Pertama tampung nama file dengan split "." kemudian tampung lagi disini berfungsi mengambil berapa banyak ekstensi gksk.
- Kemudian melakukan loop sampai gksk habis di delete.
- Mengambil perbyte kemudian di kurang 105 dan di & dengan 0xff untuk memenuhi kode ascii.
- Simpan hasil ke tmp_chiper kemudian balikan ke variable chiper untuk melakukan hal yang sama selama gksk berada di variable split_gksk.
- Hapus ekstensi dari belakang 1 per 1 dengan pop().
- Kemudian melakukan regex untuk merapikan hasil flag yang di dapatkan.
Hasilnya yang di dapat seperti di bawah.
Hal yang sama dengan soal transomware saya kekurangan waktu dan akal berfikir ketika kompetisi berlangsung sehingga flagnya gagal di submitkan ke server. Tapi setidaknya saya sudah membagikan gimana caranya melakukan reverse engineering walaupun apa yang saya ketahui masih belum cukup untuk ini semua.
0 comments:
Post a Comment