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


Monday 7 December 2015

Mengenal Buffer Overflow


Buffer Overflow merupakan teknik exploitasi yang sudah dikenal sejak dulu, namun saya baru mempelajarinya hari ini, sedikit ketinggalan memang, namun tidak ada kata terlambat untuk pengetahuan. Buffer adalah suatu area didalam memori yang telah dialokasikan sebelumnya untuk menyimpan value yang akan digunakan nantinya. Sementara itu, buffer overflow terjadi karena data yang dimasukkan kedalam buffer melebihi besarnya buffer yang duah dialokasikan pada saat deklarasi variabel, sehingga dapat memanipulasi return address yang dapat mengubah alur program yang telah dibuat.

Stack.

Bicara soal buffer, dan apapun yang berhubungan dengan memori, maka pembahasan tidak jauh dari stack, sebuah tumpukan didalam memori yang bekerja dengan mekanisme Last In First Out (LIFO), yang artinya object yang terakhir masuk kedalam stack, yang pertama dikeluarkan dari stack.

Gambar 1: ilustrasi stack (sumber)
Perlu diingat, stack tumbuh dari higher address menuju ke lower address. Puncak stack itu sendiri dapat ditemui pada register ESP pada CPU.

Buffer dalam Stack.

Dari beberapa sumber yang saya temukan, seperti artikel yang membahas buffer overflow, maupun video dari securitytube. Buffer overflow ini terjadi karena besar alokasi memori untuk buffer tidak cukup / lebih kecil dari data yang akan dimasukkan kedalam buffer, sehingga mampu memanipulasi return address yang ada pada stack.

Gambar 2: Stack Frame
Perhatikan gambar 2, gambar ini merupakan gambar stack yang berisi argument, return address, old EBP, dan buffer. Seperti yang sudah disebut sejak awal, buffer overflow terjadi karena nilai buffer yang melebihi size buffer itu sendiri, sehingga kelebihanya dapat memanipulasi nilai return address yang ada pada stack. Jika EIP menuju ke return address yang sudah dimanipulasi, maka program bisa dialikan untuk keperluan yang tidak semestinya.

Gambar 3: Kondisi Buffer Overflow
Gambar ini menunjukkan stack yang sudah diisi oleh \xaa, anggap saja besar buffer berisi 4 byte / char (buffer[4]), sementara input yang dimasukkan sebanyak 12 byte, sehingga berhasil mencapai ke return address, kondisi ini akan menyebabkan segmentation fault karena alamat \xaa\xaa\xaa\xaa tidak ditemukan dalam memori. Namun lain halnya jika \xaa\xaa\xaa\xaa yang ada pada return address diganti dengan suatu alamat didalam memori yang kemungkinan berupa shellcode?, maka program tersebuat akan mengeksekusi shellcode yang sudah dibuat, tentu saja ini merupakan masalah yang sangat serius jika terjadi.

Mengenal Lebih Dekat Buffer Overflow.

Untuk mengetahui apa yang sebenarnya terjadi pada memori, disini saya membuat contoh sederhana buffer overflow.


#include <stdio .h>

SayHello(){
 printf("Hello..\n");
}

Input(){
 char buffer[10];
 gets(buffer);
 puts(buffer);
}

main(){
 Input();
 return 0;
}

Fungsi gets() pada bahasa C memiliki kelemahan buffer overflow, karena fungsi ini tidak melakukan checking terhadap besar input yang dimasukkan. Untuk mempermudah analisis, saya meng-compile kode tersebut ke dalam format 32bit.

gcc -m32 -ggdb -mpreferred-stack-boundary=2 -o demo32 demo.c

Jalankan demo32 menggunakan gdb.


Untuk keperluan debugging, beberapa breakpoint saya pasang sebelum dan sesudah proses input. Berikut kondisi register dan stack pada saat breakpoint 1.

Pada breakpoint 1 perhatikan nilai ebp, sementara di stack belum terlihat informasi yang dicari.

Di breakpoint 2, terdapat informasi menarik didalam stack, perhatikan tanda warna merah, old-EBP (0xffffd468) sudah muncul sesuai dengan gambar stack diawal, yang berarti sesudahnya merupakan return address (0x08048465).

Pada breakpoint 3, input yang saya masukkan 'aaaaaaaaaa' jika diperhatikan, stack berisi nilai 0x61 ('a') sebanyak 10 kali, meskipun besar buffer 10 byte, memori yang dipakai sebesar 12 byte, jika besar buffer 5 byte, maka memori yang dialokasikan 8 byte untuk buffer. Selanjutnya jika 0x08048465 dibedah, maka akan merujuk ke step berikutnya.


Return Address.

Setelah sebelumnya mengenal stack dan proses input kedalam stack, bagian yang menarik adalah proses manipulasi return address. Untuk mencapai return address, perlu dilakukan perhitungan, jika pada masalah ini, buffer sebesar 10 byte, ditambah old-EBP sebesar 4 byte, maka 4 byte selanjutnya adalah return address. Dalam kasus ini, saya menyiapkan fungsi yang tidak dipanggil di main program, SayHello().

1 #include <stdio .h>
2 
3 SayHello(){
4  printf("Hello..\n");
5 }
6 
7 Input(){
8  char buffer[10];
9  gets(buffer);
10  puts(buffer);
11 }
12 
13 main(){
14  Input();
15  return 0;
16 }

Untuk mengalihkan return address ke fungsi SayHello(), maka perlu diketahui alamat dari fungsi SayHello() didalam memori.

Diketahui fungsi SayHello() berada di alamat 0x0804842b. Sesuai perhitungan, input yang dimasukkan berjumlah: 10 byte buffer + 4 byte old-EBP + 4 byte RET address yang dituju.

aaaaaaaaaa(10)+bbbb(4)+0x0804842b

Dibawah ini merupakan program ketika berjalan normal,

root@x250:~/labs# printf "aaaaaaaaaa" | ./demo32
aaaaaaaaaa

Sementara, dibawah ini ketika input melebihi buffer, program mengalami segmentation fault.

root@x250:~/labs# printf "aaaaaaaaaabbbb" | ./demo32
aaaaaaaaaabbbb
Segmentation fault
root@x250:~/labs# 

Kemudian untuk mengalihkan return address, input seperti contoh. Address dari fungsi SayHello() perlu dibalik karena memori menyimpan data dalam bentuk little endian.
Terjadi segmentation fault, namun berhasil menemukan fungsi SayHello().

Sekian catatan pribadi saya mengenai buffer overflow, jika ada yang salah atau kurang silahkan disampaikan.

Referensi :
http://insecure.org/stf/smashstack.html
https://www.exploit-db.com/docs/28475.pdf
http://www.securitytube.net/groups?operation=view&groupId=4
5 λ .: 2015 Buffer Overflow merupakan teknik exploitasi yang sudah dikenal sejak dulu, namun saya baru mempelajarinya hari ini, sedikit ketinggalan me...

Saturday 10 October 2015

Cyber Jawara 2015 Day 2 : CJ2015

Gambar 1 : CJ2015.exe
Kembali dengan soal reversing, tetapi kali ini program dibuat dengan bahasa python yang dikemas menjadi .exe. Berbeda dengan soal sebelumnya, solusi untuk soal kali ini adalah decompiling exe yang kita dapat menjadi .py sehingga mudah untuk dibaca.

Step pertama, decompile .exe menjadi executable python .pyc, untuk yang satu ini saya menggunakan unpy2exe (https://github.com/matiasb/unpy2exe).

C:\Users\..\jawara\cj2015\unpy2exe-master>python unpy2exe.py ..\cj2015.exe
Magic value: 78563412
Code bytes length: 3839
Archive name: library.zip
Extracting boot_common.py.pyc
Extracting a.py.pyc

unpy2exe menghasilkan file a.py.pyc yang belum bisa dibaca source dengan kasat mata, sehingga step selanjutnya adalah decompile a.py.pyc menjadi source python. proses ini dapat menggunakan uncomplye (https://github.com/gstarnberger/uncompyle)

C:\Users\..\Desktop\jawara\cj2015\uncompyle-master\scripts>python uncompyler.py ..\..\a.py.pyc >> a.py

Hasil dari uncompyle disimpan kedalam file a.py yang berisi code python dibawah ini:

# 2015.10.10 19:56:14 SE Asia Standard Time
print 'Cyber Jawara Online'
print '==================='

def scramble(x):
    return [ chr(i) for i in x ]

def flippity(x):
    return ''.join([ ''.join(i) for i in zip(x[1::2], x[0::2]) ])

def go():
    password = raw_input('Password: ')
    if len(password) != 22:
        return False
    if ord(password[11]) != 89 or ord(password[5]) != 69 or ord(password[16]) != 112 or ord(password[12]) != 111 or ord(password[18]) != 64 or ord(password[21]) != 33 or ord(password[13]) != 117 or ord(password[9]) != 121 or ord(password[14]) != 114 or ord(password[17]) != 64 or ord(password[7]) != 106 or ord(password[1]) != 36 or ord(password[15]) != 95 or ord(password[19]) != 115 or ord(password[20]) != 115 or ord(password[3]) != 121 or ord(password[10]) != 95 or ord(password[8]) != 48 or ord(password[6]) != 110 or ord(password[2]) != 97 or ord(password[4]) != 95 or ord(password[0]) != 101:
        return False
    return flippity(scramble([74,
     67,
     48,
     50,
     53,
     49,
     103,
     123,
     48,
     48,
     66,
     100,
     101,
     121,
     97,
     74,
     75,
     99,
     125,
     33]))

print go()

+++ okay decompyling ..\..\a.py.pyc 
# decompiled 1 files: 1 okay, 0 failed, 0 verify failed
# 2015.10.10 19:56:14 SE Asia Standard Time

Dalam bentuk seperti ini, semakin mudah dibaca tentunya. Ternyata ada 2 kondisi password yang akan diterima, kondisi pertama panjang password adalah 22, kondisi yang kedua ada beberapa deretan huruf yang masih berupa bilangan dec, jika disusun kemungkinan membentuk password yang benar. Maka saya melakukan mapping array dengan kondisi yang benar, seperti dibawah ini.

array : kondisi yang benar (dec)

0 : 101
1 : 36
2 : 97
3 : 121
4 : 95
5 : 69
6 : 110
7 : 106
8 : 48
9 : 121
10 : 95
11 : 89
12 : 111
13 : 117
14 : 114
15 : 95
16 : 112
17 : 64
18 : 64
19 : 115
20 : 115
21 : 33

Dari deretan angka decimal tersebut jika diterjemahkan (http://www.asciitohex.com/) kedalam ascii akan menjadi seperti: e$ay_Enj0y_Your_p@@ss!

Gambar 2 : The Flag
Password yang didapat saya coba masukkan kedalam program, dan muncul flag :
CJ2015{g00dByeJacK!}

Sekian write up - write up-an kali ini, semoga bermanfaat..
5 λ .: 2015 Gambar 1 : CJ2015.exe Kembali dengan soal reversing, tetapi kali ini program dibuat dengan bahasa python yang dikemas menjadi .exe. Berb...

Cyber Jawara 2015 Day 2 : txt-img Kang Slamet

Gambar 1 : Petunjuk dari Kang Slamet
Langsung saja, pada soal hari kedua kang slamet memberikan clue : PNG dan beberapa angka yang berpasangan, jika dilihat dari kombinasi angka tersebut bisa jadi ini merupakan titik koordinat dari clue yang diberikan. Peserta diminta untuk merepresentasikan koordinat yang diberikan kedalam sebuah gambar. Saya menggunakan bahasa python untuk menerjemahkan titik-titik tersebut. Kurang lebih code yang saya buat seperti ini.


from PIL import Image

code = "1,3 1,4 1,5 1,6 2,2 2,7 3,2 3,7 4,3 4,6 6,6 7,7 8,2 8,7 9,2 9,3 9,4 9,5 9,6 11,3 11,7 12,2 12,6 12,7 13,2 13,5 13,7 14,3 14,4 14,7 17,3 17,4 17,5 17,6 18,2 18,7 19,3 19,4 19,5 19,6 22,3 22,7 23,2 23,3 23,4 23,5 23,6 23,7 24,7 26,2 26,3 26,4 26,6 27,2 27,4 27,7 28,2 28,4 28,7 29,2 29,5 29,6 31,4 32,2 32,4 32,6 33,1 33,3 33,5 33,7 34,1 34,7 36,5 37,4 37,6 37,8 38,4 38,6 38,8 39,4 39,5 39,6 39,7 42,3 42,4 42,5 42,6 43,2 43,7 44,3 44,4 44,5 44,6 47,3 47,4 47,5 47,6 48,2 48,7 49,3 49,4 49,5 49,6 51,5 51,6 52,4 52,7 53,4 53,6 54,2 54,3 54,4 54,5 54,6 54,7 56,8 57,8 58,8 59,8 60,8 61,2 61,3 61,4 61,5 61,6 61,7 62,4 62,7 63,4 63,7 64,5 64,6 66,4 66,5 67,6 67,8 68,6 68,8 69,4 69,5 69,6 69,7 71,3 71,6 72,2 72,7 73,2 73,4 73,7 74,3 74,5 74,6 76,8 77,8 78,8 79,8 80,8 82,7 83,8 84,2 84,4 84,5 84,6 84,7 86,5 86,6 87,4 87,7 88,4 88,7 89,5 89,6 91,5 91,7 92,4 92,5 92,7 93,4 93,6 93,7 94,4 94,6 98,3 98,4 98,5 98,7 102,1 102,7 103,1 103,3 103,5 103,7 104,2 104,4 104,6 105,4"

kode = code.split()
im = Image.new('RGBA',(200,100))
im.getpixel((0,0))
for i in kode:
  coor = i.split(',',1)
  im.putpixel((int(coor[0]),int(coor[1])),(0,0,0))
im.save('CJ2015.png')


Kode python diatas menggambar titik dari koordinat yang diberikan dan hasilnya akan disimpan ke dalam file CJ2015.png. Hasilnya seperti gambar dibawah ini.

Flag : CJ2015{g00d_by3_jos!}



5 λ .: 2015 Gambar 1 : Petunjuk dari Kang Slamet Langsung saja, pada soal hari kedua kang slamet memberikan clue : PNG dan beberapa angka yang berpa...

Cyber Jawara 2015 Day 1 : LoginCJ (Medium I)

Soal selanjutnya merupakan soal reversing, peserta diberikan file executable bernama LoginCJ, secara singkat peserta diminta untuk menebak username dan password untuk login ke LoginCJ.exe, berikut tampilan aplikasinya.

Gambar 1 : LoginCJ.exe
Gambar 2 : Gagal Login
Gambar 2 merupakan tampilan aplikasi jika username dan password tidak sesuai. Singkat cerita, dibuka aplikasi itu kedalam immunity debugger, dan saya cari reference string yang ada seperti gambar dibawah ini.

Gambar 3 : String
Terdapat 2 String yang sepertinya kombinasi dari username dan password. Saya mulai kembali debugger dengan mengisi username="username" dan password="password", bertjuan untuk mengetahui string mana yang merupakan username/password.

Gambar 4 : Password
Gambar 5 : Username
Setelah beberapa step, string "password" yang dimasukkan ternyata mengarah ke string 2015j4w4racYb3RR, dan username didapatkan berupa J4w4r4cyb3rrrr.

Gambar 6 : Sukses login
username dan password yang didapat dari proses sebelumnya ternyata berhasil, aplikasi menampilkan beberapa gambar dan tulisan hijau JC2015{LANTING, namun setelah saya coba masukkan, ternyata bukan itu flagnya. Sayangnya, waktu perlombaan hari pertama sudah habis, dan web scoring sudah ditutup. So, kita tunggu write up dari peserta lainnya.

5 λ .: 2015 Soal selanjutnya merupakan soal reversing, peserta diberikan file executable bernama LoginCJ, secara singkat peserta diminta untuk menebak...

Cyber Jawara 2015 Day 1 : Breakmyfall (Medium I)




Soal kali ini diberikan paket bernama breakmyfail.tar.gz yang setelah diextract berisi 2 file, yang pertama file jawara, dan file mail.txt. Setelah dicek, ternyata file jawara merupakan file SVG, sementara mail.txt hanya text biasa. Berikut isi fail mail.txt :

Gambar 1 : Isi file breakmyfall.tar.gz
Isi email dibungkus dengan Base64 encoding, setelah didecode kira-kira isinya seperti ini :

Selamat siang,

Mohon bantuan untuk aksi peretasan pada datacenter kami yang dilakukan oleh orang tidak bertanggung jawab.
Mungkin hacker/craker telah menanamkan sesuatu pada salah satu server kami yang ada didata center, 
karna tim kami menemukan satu file yang tertinggal disana.

Hasil penemuan tersebut kami lampirkan pada attachment.

Atas bantuan dan perhatiannya diucapkan terima kasih
-- 

*Best Regard*
Hayabusa

Joger Corp

Sementara, isi file jawara adalah sebagai berikut :

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<svg width="3.92cm" height="3.92cm" viewBox="0 0 37 37" preserveAspectRatio="none" version="1.1" xmlns="http://indonesiancoder.com">
<g id="Base">
<rect x="0" y="0" width="37" height="37" fill="#ffffff" />
<g id="Pattern">
<rect x="0" y="0" width="1" height="1" fill="#000000" />
<rect x="1" y="0" width="1" height="1" fill="#000000" />
<rect x="2" y="0" width="1" height="1" fill="#000000" />
<rect x="3" y="0" width="1" height="1" fill="#000000" />
-------------------- Snip --------------------------------

 Jika dilihat dari image viewer, maka akan tampil seperti pada gambar dibawah ini.

Gambar 2: Render original SVG
Ada bagian yang janggal menurut Saya, jika dillihat baik-baik, ada bagian yang hilang disisi kanan QC code. QR code yang benar memiliki 3 kotak besar di sisi QR tersebut. Setelah ditelusuri, Saya mencoba menghilangkan background dari QR tersebut dengan cara menghapus code berwarna hijau dibawah ini.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<svg width="3.92cm" height="3.92cm" viewBox="0 0 37 37" preserveAspectRatio="none" version="1.1" xmlns="http://indonesiancoder.com">
<g id="Base">
<rect x="0" y="0" width="37" height="37" fill="#ffffff" />
<g id="Pattern">
<rect x="0" y="0" width="1" height="1" fill="#000000" />
<rect x="1" y="0" width="1" height="1" fill="#000000" />
<rect x="2" y="0" width="1" height="1" fill="#000000" />
<rect x="3" y="0" width="1" height="1" fill="#000000" />
-------------------- Snip --------------------------------

Setelah dirender, maka akan tampil gambar dibawah ini.

Gambar 3 : QR belum komplit
Ternyata bagian yang hilang disembunyikan dengan cara diwarnai dengan warna putih. Untuk melengkapinya cukup mengganti semua warna putih fill=#ffffff menjadi #000000, maka akan tampil QR yang utuh setelah memulihkan kembali background yang berwarna putih.

Untuk SVG renderer online dapat dijumpai pada website http://jsfiddle.net/

Gambar 4 : Complete QR

Scan untuk mendapatkan petunjuk berikutnya, dapat menggunakan scanner yang ada di hp atau online seperti https://webqr.com/.

Gambar 5 : The Flag
Flag telah ditemukan dari QR code tersebut : Y0u_Kn0w_mY_n4me_n0t_My_S70ry

Flag : CJ2015{Y0u_Kn0w_mY_n4me_n0t_My_S70ry}
5 λ .: 2015 Soal kali ini diberikan paket bernama breakmyfail.tar.gz yang setelah diextract berisi 2 file, yang pertama file jawara, dan file mail.tx...

Cyber Jawara 2015 Day 1 : SUUNTO (Medium I)


Soal Medium I dengan poin 50, diberikan sebuah gambar cyber jawara yang kemungkinan sebuah soal stegano, kurang lebih gambarnya seperti gambar 1.

Gambar 1 : Ilustrasi gambar yang diberikan (bukan gambar sebenarnya)
Setelah dikupas, terdapat info berupa short URL kplg.co/09UE yang kemungkinan sebuah url ke petunjuk berikutnya.

Gambar 2 : Info URL yang terdapat di gambar
Setelah ditelusuri, ternyata link tersebut mengarah ke dropbox yang berisi file bernama SUUNTO_DJ.rar

Gambar 3 : Dropbox link SUUNTO
Singkat cerita, file tersebut terbagi kedalam part kecil yang cukup diextract, maka akan mendapatkan kumpulan gambar seperti QR code.

Gambar 4 : QR puzzle
Seperti menyusun puzzle, susun gambar tersebut seperti QR code yang utuh, ada beberapa gambar yang tidak terpakai yang mungkin digunakan untuk mengecoh para peserta.

Gambar 5 : QR complete
Setelah disusun menjadi QR yang utuh, scan menggunakan QR reader yang ada di smartphone, maka akan muncul informasi berupa url seperti gambar dibawah ini.

Gambar 6 : Flag
Dari URL yang didapat, ternyata berisi flag dari soal ini yaitu d4mn1l0v31nd0n3514, secara lengkap flagnya CJ2015{d4mn1l0v31nd0n3514}



5 λ .: 2015 Soal Medium I dengan poin 50, diberikan sebuah gambar cyber jawara yang kemungkinan sebuah soal stegano, kurang lebih gambarnya seperti g...

Tuesday 16 June 2015

Top Hat Sec : Reversing Mini Series Part 4

Crackme4 (link) merupakan lanjutan dari top hat sec reversing mini series yang sama seperti edisi sebelumnya, tebak-tebakan angka masih menjadi tema seri ke-4 ini.

Gambar 1 : Crackme4
Dari 2 percobaan diatas, crackme4 meminta 4 input user secara berurutan, kemuadian diakhir program terdapat tulisan fail. Berbeda dengan seri sebelumnya, salah menebak angka pada urutan pertama tidak membuat program ini berhenti, untuk memastikan apa kondisi "SUCCESS" dari keempat bilangan yang ditebak, mari kita coba lihat menggunakan debugger.

Gambar 2 : Reference text
Setelah di-run dengan immunity debugger, pada references string terlihat text dari crackme4 yang dijalankan diawal. Perhatikan tanda panah merah pada gambar 2, ada text [FAIL] dan [SUCCESS], yang menarik disini adalah text "SUCCESS" yang dimunculkan, apa kira-kira kondisi yang akan mencetak text success?. Follow alamat string, dan mulai analisa kembali.

Gambar 3 : Analisis Crackme4

Perhatikan lingkaran merah pada gambar 3, terdapat nilai yang disimpan ke EBP-1C = 91EC78 yang akan dicompare dengan nilai EAX pada lingkaran yang kedua. Lalu berapa atau apa operasi yang dilakukan sebelum mendapatkan nilai EAX. Kita lihat lebih dekat.

Gambar 4 : Operasi
MOV EDX, ..[EBP-20] jika anda perhatikan pada gambar 3 saya memberi angka merah pada gambar, [EBP-20] merupakan angka yang diinput pertama kali.

MOV EAX, ..[EBP-24] merupakan input kedua.

IMUL EDX, EAX : operasi perkalian antara input 1 dan 2 yang disimpan di EDX.

MOV EAX, ..[EBP-28] merupakan input ketiga

IMUL EDX, EAX : operasi perkalian hasil kali input 1 dan 2 dengan input 3

MOV EAX, ..[EBP-2C] merupakan input keempat

IMUL EAX, EDX : operasi perkalian antara input 4 dengan hasil kali bilangan input sebelumnya.

CMP EAX, ..[EBP-1C], ini bagian yang menarik, ternyata hasil perkalian keempat bilangan tersebut akan di compare dengan nilai yang ada di [EBP-1C] yang diketahui bernilai 91EC78 yang dalam desimal bernilai 9563256.

Maka dari analisa kode diatas, dapat diduga kondisinya adalah:

x = input1 * input2 * input3 * input4
if (x == 9563256) print "SUCCESS";
else print "FAIL"

Masalah selanjutnya adalah berapa nilai masing-masing input yang jika dikalikan bernilai 9563256?.


Gambar 5 : Factorial
2*2*2*3*3*317*419 bisa disederhanakan menjadi 8*9*317*419

Gambar 6 : Hasil input factorial
dan hasilnya "SUCCESS", namun ada cara yang lebih mudah,tidak perlu cara memfaktorkan bilangan seperti diatas, karena sejak awal kita sudah tau jawabannya 9563256 yaitu dengan cara :

Gambar 7 : Problem?
Ya, demikian rangkaian pembahasan Top Hat Sec : Reversing Mini Series semoga bermanfaat.



  
5 λ .: 2015 Crackme4 ( link ) merupakan lanjutan dari top hat sec reversing mini series yang sama seperti edisi sebelumnya, tebak-tebakan angka masih me...

Monday 15 June 2015

Top Hat Sec : Reversing Mini Series Part 3

Kembali lagi dengan Top Hat Sec reversing mini series, yang kali ini aplikasi yang diupload sedikit berbeda dengan crackme2, yang ditambahkan pada crackme3 ialah input dari magic number. Ya, lagi-lagi tebakan magic number, namun sepertinya ada beberapa magic number yang perlu ditebak dengan benar. (Crackme3 dapat diunduh melalui lin ini : Crackme3)

Gambar 1 : Crackme 3
Terlihat di gambar 1, crackme3 meminta urutan bilangan yang pertama, artinya akan ada bilangan selanjutnya yang harus ditebak. Jika angka yang ditebak pada urutan pertama salah, maka crackme3 akan langsung menutup dengan memberi pesan [NOT ACCEPTED].

Langsung saja saya analisis melalui immunity debugger, untuk mempercepat proses pencarian address dimana kondisi tersebut dijalankan, cukup dengan mencari text "top-hat" pada text string references yang ada pada crackme3. Klik Play kemudian cari semua references text strings.

Gambar 2 : Text String References
Pada text string references, cari text yang menjadi ciri khas crackme3, maka didapat header [*] Top-Hat-Sec pada alamat 0x0046A8AA, follow alamat (Tekan Enter) tersebut diassembly.

Gambar 3 : Search for Text String References
Jika dilihat dari gambar 3, maka akan ada tiga magic number yang harus ditebak, dan jika salah satu dari urutan magic number salah maka crackme akan mencetak [NOT ACCEPTED] kemudian exit, sebaliknya jika berhasil maka di masing-masing step akan muncul pesan [ xxx NUMBER ACCEPTED].

Gambar 4 : Alamat 046A88AA
Pada gambar 4, dapat dilihat terdapat beberapa CMP operation dimana nilai input x dibandingkan dengan bilangan pasti dalam bentuk hex. berikut CMP operation yang ada pada gambar 4:

CMP x,539
CMP y,7CF
CMP z,421
(x,y,z merupakan input user)

Gambar 5 : CMP operation
Setelah bilangan dicompare, terdapat string bertuliskan x number accepted. Maka ada kemungkinan bilangan yang dicompare merupakan kondisi yang 'true', jika bilangan yang ada pada CMP dikonversi menjadi bilangan desimal, maka hasilnya:

CMP x,539  = 1337
CMP y,7CF = 1999
CMP z,421  = 1057

Setelah saya coba memasukkan bilangan tersebut secara berurutan maka hasilnya :

Gambar 6 : hasil uji coba
[NUMBERS ACCEPTED, GOOD JOB!]

Demikian artikel sederhana ini saya sajikan, semoga bermanfaat.

5 λ .: 2015 Kembali lagi dengan Top Hat Sec reversing mini series, yang kali ini aplikasi yang diupload sedikit berbeda dengan crackme2, yang ditambahka...

Thursday 30 April 2015

Top Hat Sec : Reversing Mini Series Part 2

Top Hat Sec mempublish sebuah challenge tentang reverse engineering yang cocok untuk pemula yang ingin belajar dan mengenal tentang reversing. Challenge yang dibuat THC kali ini adalah kita harus menebak magic number yang ada diaplikasi crackme2, kira-kira seperti ini tampilannya.

Gambar 1 : Crackme2

File challenge dapat di download pada link ini : Crackme2[*]

Langsung saja, langkah yang pertama adalah mengamati alur dari aplikasi itu sendiri. Sebelumya, download aplikasi debugger seperti ollydbg , immunity debugger, dll. sesuai dengan selera masing-masing, yang saya gunakan pada saat ini adalah immunity debugger. Tidak lupa baca juga artikel tentang assembly language paling tidak sampai paham pengunaan general purpose register, karena jika kita berbicara tentang reverse engineer, pasti akan menemui bahasa "aneh" yang satu ini.

Gambar 2 : Proses ketika tebakan angka salah

Dari percobaan diatas, secara singkat alur dari program tersebut dapat digambar di bawah ini :

Gambar 3 : Flowchart
Flowchart pada gambar 3 merupakan hasil analisis sederhana terhadap perilaku aplikasi tersebut. Untuk melihat lebih dalam lagi, perlu menggunakan debugging tool.

Gambar 4 : Immunity Debugger Start
Lanjut ke analisa aplikasi melalui immunity debugger, run crackme2 step by step (F8) atau bisa juga dengan klik tanda panah pada gambar 4, dan amati perlakunya.

Gambar 5 : Breakpoint 1
Perhatikan, pada saat pointer menunjuk address 00401290 (highlight biru), aplikasi memanggil fungsi di alamat crackme2.00401000 dan menampilkan output seperti gambar sebelah kanan. Untuk lebih jelas proses apa yang dipanggil, follow (tekan enter) address 00401000.

Gambar 6 : Follow
Supaya bisa melanjutkan proses analisis, pasang breakpoint (tekan F2) pada address 00401000, re-run immunity dan lanjutkan step (F8).

Gambar 7 : Breakpoint 2
Pada address 004010F8, aplikasine loncat lagi ke address crackme2.0046A894, maka perlu dipasang breakpoint lagi, kemudian follow address 0046A894.

Gambar 8 : Breakpoint 3
Sampai disini (0046A894), Terlihat tanda dari crackme yang dijalankan, dari ASCII yang ada, dapat disimpulkan ketika magic number salah, maka print [FAIL], jika magic number yang kita masukkan benar, maka print [SUCCESS]. Pertanyaanya adalah, apa kondisi yang menyatakan bahwa x input adalah magic number?. Pasang breakpoint (F2), pada address 0046A894, kemudian lanjut lagi step by step (F8), jangan lupa untuk di re-run.
Gambar 9 : 0046A8CA User Input
0046A8CA, Call crackme2.00446864. output yang ditampilkan aplikasi meminta input magic number, sebagai contoh saya masukkan angka 88 dan perhatian step selanjutnya yaitu PUSH EDX. Jadi hasil input yang dimasukkan (88) dimasukkan ke register EDX.
Gambar 10 : EDX
Dan dapat dilihat pada gambar 10, nilai EDX sekarang adalah 00000058. 58? padahal input yang dimaukkan tadi adalah 88. Tidak ada yang salah dengan ini, 58 yang ada di EDX merupakan bilangan HEX, maka jika 58 diconvert ke decimal maka hasilnya 88. (silahkan dicek www.asciitohex.com)

Gambar 11 : CMP
Step selanjutnya setelah PUSH EDX adalah CMP nilai yang ada di [EBP-C] dengan 15E. Apa itu CMP? (silahkan dibaca di CMP artikel) yang menarik disini adalah bilangan yang dibandingkan dengan value dari [EBP-C]. Nilai dai [EBP-C] ternyata bilangan yang sudah dimasukkan 88 (0x58). nilai ini yang dibandingkan 15E, dan jika kita convert ke decimal maka 15E=350. Perhatikan instruksi selanjutnya JE crackme.0046A92B, apa itu JE? (baca). Sedikit saya jelaskan, JE (Jump Equal) artinya jika hasil compare 0x58 sama denngan 0x15E maka loncat ke address 0046A92B, yang artinya magic number yang seharunya dimasukkan adalah 15E atau 350.

Gambar 12 : Success
Ada apa di jump address 0046A92B, langsung saja di follow, seperti gambar diatas, terdapat ASCII code "[SUCCESS]". Setelah mengetahui magic number yang seharunya dimasukkan, mari ita coba lagi tanpa debugger.

Gambar 13 : 350, Success
And yes, 350, Success.

Sekian, semoga bermanfaat.


5 λ .: 2015 Top Hat Sec  mempublish sebuah challenge tentang reverse engineering yang cocok untuk pemula yang ingin belajar dan mengenal tentang reversi...
< >