How to hack #IDSECCONF2014 ctf online challenge - nganggur
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
IDSECCONF2014 CtF writeup by nganggur
Easy Exploit
.text:0804850C public main
.text:0804850C main proc near ; DATA XREF: _start+17�o
Disini kita bisa menyimpulkan, dengan mengganti input name password dengan array,
semua input user akan diterma karena semua password akan diload oleh script.
Jadi apapun input password kita, asalkan username nya benar, sistem akan menganggap inputan itu valid.
Easy Reversing.
Disini kita dikasih binary EXE.
EXE ini adalah format EXE dari microsoft .NET
Salah satu cara buat analsisi .NET executable adalah menggunakan ILSpy (http://ilspy.net/)
Setelah dibuka dengan ILSpy, bagian yang menarik dari program ini adalah :
Disini ada 3 hal yang bisa kita lakuin :
1. Cari apa sebenarnya isi dari variabel text 2. Langsung keluarin messagebox yang isinya stringBuilder.ToString() 3. Patch programnya, jadi apapun string yang diinput, program akan menampilin message box
yang teksnya adalah Flag.
Untuk opsi 1 dan 2, kita bikin program yang sama, dengan kode yang sama menggunakan Microsoft Visual Studio.
Disini kita dikasih executable, encoded string, dan petunjuk key yang dipakai, executable nya adalah program untuk mengencode string menggunakan key. Kita disuruh buat decode string VLZHXPZNYRBXPMEB dan key untuk decode nya harus dicari sendiri (clue : key ada didalam encode).
Dari analisis program, pemanggilan fungsi untuk encode ada di
Dan fungsinya sendiri adalah :
Dengan menggunakan plugin Hex-rays disassembly, didapat :
Dimana yang menarik disini adalah, fungsi encode ini merupakan fungsi encode mod 26
c = (p + k) mod 26
Sehingga fungsi decodenya adalah
p = (c – k) mod 26
c = ciphertext, p = plaintext, k = key
Dan ini code yang saya buat untuk decode string :
Setelah teks dan clue diganti oleh CTF lord nya, akhirnya level ini bisa terpecahkan. (asli.. ga nemu key buat decode string pertamanya..)
To decode : WFGNEOFGEDQGE
Key : ABCD
Sehingga string asli setelah di decode adalah : WEEKENDDECODE
Bonus : Hard Reverse
Meskipun level ini ga selesai pas ctf, ane iseng ngerjain aja (pas ctf cuman dikasih sejam buat nyelesain level ini.. ctf lord nya rada rada kejam keknya.. :p)
Singkat cerita, executable dari hardrev ini adalah sebuah server yang standby untuk menerima dan mengirim string dimana untuk memulai proses kirim terima string ini, ada 1 kata pembuka yang harus dikirim client ke server yaitu : ohmyweeekendplis\n
Setelah server menerima string itu, server akan mengirim 84 string random yang diencode 2 kali ke client. Apabila client bisa mengirim balik decoded string nya (plaintext) maka server akan mengirim flag ke client.
Call ke loop utama program :
Ini call yang ada di dalam loop main call.
sub_40109D adalah fungsi pengecekan string pembuka dimana apabila client salah mengirim string, program akan berhenti.
Ini fungsi pengecekan kata pembuka :
Server HARUS menerima string ohmyweeekendplis\n dari client.
Selanjutnya, server akan mengulang proses pada sub_400ED2 sebanyak 54h (84) kali dan apabila return dari fungsi tersebut selalu true, pada loop terakhir server akan membaca file flag dan mengirimkan isinya ke client.
Di dalam sub_400ED2, ada 2 fungsi yang menarik yaitu sub_400CEC dan sub_400E58.
Fungsi di sub_400CEC, akan mengambil input string random dari program dan outputnya adalah array dari integer sebanyak panjang string inputan, dan sub sub_400E58 akan mengambil input dari array tersebut, setiap elemen dari array itu akan diconvert ke string, kemudian diencode dan hasil string nya akan dikirim ke client.
Setiap karakter input, akan dikurangkan dengan 10 dan diappend dengan karakter 5Fh (_) sebanyak 2 karakter.
Snapshot pada fungsi sub_400CEC :
Di fungsi ini, ada 3 loop dimana tiap loop akan memroses tiap karakter yang ada dari string dan mentranformasi string tersebut menjadi array dari bilangan integer.
Berikut code python untuk encode string :
def encode_part2(part2):
i = 0
c2 = 0
c3 = 0
ln = len(part2)
arr = [0] * ln
j = 0
while i < ln:
arr[i] = ((i << 4) + ln) ^ ord(part2[i])
c2 = 0
while c2 < i:
arr[c2] = arr[c2] ^ (~(arr[i]))
c3 = 0
while c3 < c2:
arr[c3] = arr[c3] + (~(arr[c2] ^ arr[i]))
c3 += 1
c2 += 1
i += 1
return arr
Dan untuk string decodernya :
def decode_part2(part2):
ln = len(part2)
i = ln - 1
c2 = 0
c3 = 0
arr = list(part2)
while i >= 0:
c2 = i - 1
while c2 >= 0:
c3 = c2 - 1
while c3 >= 0:
arr[c3] = arr[c3] - (~(arr[c2] ^ arr[i]))
c3 -= 1
arr[c2] = arr[c2] ^ (~(arr[i]))
c2 -= 1
arr[i] = ((i << 4) + ln) ^ arr[i]
i -= 1
ch = [chr(x) for x in arr]
return "".join(ch)
Flag dari level ini gak diketahui karna server buat ngetest nya udah dimatiin. Tapi dari hasil eksekusi, nampaknya level ini berhasil ditembus.
Server :
Client :
Source code dari client bisa dilihat di test-client.py