24 Desember 2016

Basic Reverse Engineering Linux Binaries


Basic Reverse Engineering Linux Binaries
assalamualaikum.

Saya akan sedikit membahas basic dalam melakukan reverse engineering elf binnary, reverse engineering sendiri sangat penting apalagi dalam challenge CTF yang biasa nya mempunyai poin yang besar.

The C0de
root@kali:~# cat rev.c
#include <stdio.h>

int main(){
    int a,b,c,d;
    a = 306;
    b = 737;
    c = 100 * a + b;
    printf("Enter your passcode : ");
    scanf("%d", &d);
    if(d == c){
        puts("Correct");
}    else{
        puts("Incorrect");
}
    return 0;
}

Proof Of Concept
root@kali:~# gcc rev.c -o rev
root@kali:~# gdb -q rev
(gdb) set disassembly-flavor intel
(gdb) disass main
Dump of assembler code for function main:
   0x0000555555554760 <+0>:    push   rbp
   0x0000555555554761 <+1>:    mov    rbp,rsp
   0x0000555555554764 <+4>:    sub    rsp,0x10
   0x0000555555554768 <+8>:    mov    DWORD PTR [rbp-0x4],0x132
   0x000055555555476f <+15>:    mov    DWORD PTR [rbp-0x8],0x2e1
   0x0000555555554776 <+22>:    mov    eax,DWORD PTR [rbp-0x4]
   0x0000555555554779 <+25>:    imul   edx,eax,0x64
   0x000055555555477c <+28>:    mov    eax,DWORD PTR [rbp-0x8]
   0x000055555555477f <+31>:    add    eax,edx
   0x0000555555554781 <+33>:    mov    DWORD PTR [rbp-0xc],eax
   0x0000555555554784 <+36>:    lea    rdi,[rip+0xd9]        # 0x555555554864
   0x000055555555478b <+43>:    mov    eax,0x0
   0x0000555555554790 <+48>:    call   0x555555554600 <printf@plt>
   0x0000555555554795 <+53>:    lea    rax,[rbp-0x10]
   0x0000555555554799 <+57>:    mov    rsi,rax
   0x000055555555479c <+60>:    lea    rdi,[rip+0xd7]        # 0x55555555487a
   0x00005555555547a3 <+67>:    mov    eax,0x0
   0x00005555555547a8 <+72>:    call   0x555555554610 <__isoc99_scanf@plt>
   0x00005555555547ad <+77>:    mov    eax,DWORD PTR [rbp-0x10]
   0x00005555555547b0 <+80>:    cmp    eax,DWORD PTR [rbp-0xc]
   0x00005555555547b3 <+83>:    jne    0x5555555547c3 <main+99>
   0x00005555555547b5 <+85>:    lea    rdi,[rip+0xc1]        # 0x55555555487d
   0x00005555555547bc <+92>:    call   0x5555555545f0 <puts@plt>
   0x00005555555547c1 <+97>:    jmp    0x5555555547cf <main+111>
   0x00005555555547c3 <+99>:    lea    rdi,[rip+0xbb]        # 0x555555554885
   0x00005555555547ca <+106>:    call   0x5555555545f0 <puts@plt>
   0x00005555555547cf <+111>:    mov    eax,0x0
   0x00005555555547d4 <+116>:    leave 
   0x00005555555547d5 <+117>:    ret   
End of assembler dump.
Command set disassembly-flavor intel digunakan agar hasil disassembly menggunakan syntax intel, karena terdapat 2 syntax pada gdb yaitu att dan intel. sedangkan disass main merupakan command untuk melakukan disassembly pada fungsi main, apabila ingin melakukan disassembly pada fungsi lain bisa menggunakan disass nama_fungsi.

Dari hasil disassembly diatas, terdapat instruksi yang akan memindahkan nilai hex 0x132 ke rbp-0x4 dan 0x2e1 rbp-0x8.
Yang apabila 0x132 dan 0x2e1 dikonversi ke decimal akan menghasilkan 306 dan 737 sama seperti nilai dari variable a,b.
   0x0000555555554768 <+8>:    mov    DWORD PTR [rbp-0x4],0x132
   0x000055555555476f <+15>:    mov    DWORD PTR [rbp-0x8],0x2e1
Selanjutnya nilai 0x132 yang tersimpan pada rbp-0x4 akan dipindahkan ke register eax
   0x0000555555554776 <+22>:    mov    eax,DWORD PTR [rbp-0x4]
Lalu terdapat intruksi imul, imul digunakan untuk melakukan operasi perkalian
pada intruksi ini terdapat 0x64 ( konversi ke decimal = 100, sama seperti yang di source code), yang akan dikalikan dengan register eax ( nilai 0x132 ), 0x64 * 0x132 = 0x7788, dan hasil kali tersebut akan disimpan di register edx.
   0x0000555555554779 <+25>:    imul   edx,eax,0x64
Selanjutnya nilai 0x2e1 yang tersimpan pada rbp-0x8 akan dipindahkan ke register eax
   0x000055555555477c <+28>:    mov    eax,DWORD PTR [rbp-0x8]
Sehingga masuk pada intruksi add yang melakukan operasi pertambahan antara 0x2e1 + 0x7788 = 0x7a69 (31337), lalu akan memindahkan nilai 0x7a69 pada eax ke rbp-0xc, setelah itu baru memindahkan user input (scanf) yang tersimpan sementara di rbp-0x10 ke register eax.
   0x000055555555477f <+31>:    add    eax,edx
   0x0000555555554781 <+33>:    mov    DWORD PTR [rbp-0xc],eax
            --- snip ---
   0x00005555555547ad <+77>:    mov    eax,DWORD PTR [rbp-0x10]
Setelah itu intruksi cmp akan melakukan compare antara nilai 0x7a69 yang berada di rbp-0xc dan inputan passcode kita yang berada di eax.
   0x00005555555547b0 <+80>:    cmp    eax,DWORD PTR [rbp-0xc]
Apabila hasil compare tidak sama (jne = jump if not equal), maka akan menuju offset 0x5555555547c3 dan mengeluarkan pesan "Incorrect".
   0x00005555555547b3 <+83>:    jne    0x5555555547c3 <main+99>
            --- snip ---
   0x00005555555547ca <+106>:    call   0x5555555545f0 <puts@plt>
Sedangkan apabila sama, akan melewati intruksi jne dan dan mengeluarkan pesan "Correct".
   0x00005555555547bc <+92>:    call   0x5555555545f0 <puts@plt>
Dari pembahasan diatas, diketahui bahwa passcode yang valid adalah 31337

Apabila kita sudah mengerti uraian diatas, sebenar nya kita bisa mencari passcode yang tersimpan dalam register secara otomatis tanpa menghitung manual seperti diatas jika kita sudah sedikit mengerti intruksi assembly.

Proof Of Concept #2

Saya memasang breakpoint pada offset 0x00005555555547b0 #<+80>, untuk melihat nilai yang tersimpan di rbp-0xc

(gdb) b *0x00005555555547b0
Breakpoint 1 at 0x5555555547b0
(gdb) r
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: ~/rev
Enter your passcode : 123456

Breakpoint 1, 0x00005555555547b0 in main ()
(gdb) x $rbp-0xc
0x7fffffffe244:    0x00007a69
(gdb) print 0x00007a69
$1 = 31337

Karena passcode yang valid sudah diketahui, bisa langsung membuktikan dengan menjalankan program nya.
root@kali:~# ./rev
Enter your passcode : 31337  
Correct

Akhir Kata...
Saya sendiri sebenarnya tidak terlalu ahli dalam reverse engineering, saya menulis posting ini ditujukan kepada siapa saja yang ingin belajar sehingga bisa mendapatkan pengetahuan dasar mengenai reverse engineering. Jadi semoga tulisan ini dapat bermanfaat bagi kita semua.

6 Oktober 2016

Windows Forensic Artifact - Registry Part 1


"Menurut Wikipedia, Registry, dalam platform sistem operasi Microsoft Windows 32-bit, merupakan sebuah basis data yang disusun secara hierarkis yang mengandung informasi mengenai konfigurasi sebuah sistem, mulai dari konfigurasi perangkat keras, perangkat lunak, asosiasi ekstensi berkas dengan aplikasinya hingga preferensi pengguna."

Pada postingan ini hanya akan membahas hive HKCU (HKEY_CURRENT_USER) , HKCU sendiri support pada file NTUSER.DAT.

Run Command History

history Run Command ( CTRL + R ) terletak pada HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RunMRU
Name nya terdiri dari alfabet, dan MRUList terlihat pada bagian data merupakan history command yang paling terkahir digunakan adalah pada letter 'b'.

Recent Open And Save File

History Recent Open And Save File terletak pada key HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32, dimana key tersebut mempunyai 2 sub-key penting yaitu OpenSavePidlMRU dan LastVisitedPidlMRU.

- OpenSavePidlMRU akan tercatat apabila file yang kita Open/Save melalui "Windows Shell Dialog", Windows Shell Dialog sendiri merupakan dialog save atau open yang sering kita lihat apabila ingin mendownload gambar misal nya melalui browser, atau saat ingin membuka file pada office word.

file : myurl.txt

Pada bagian value nya terdapat angka index 0 sampai 3, yang merupakan index file yang pernah saya open/save, untuk value MRUListEx pada bagian data nya berisi masing2 nilai index file, yang paling kiri adalah file paling baru yang di open/save.

- LastVisitedPidlMRU berisi value dari nama applikasi yang digunakan untuk Open/Save file pada key OpenSavePidlMRU


Karena tadi saya membuka file .txt, tepat nya pada index ke 6, tercatat aplikasi notepad.exe yang memang saya gunakan untuk membuka file 'myurl.txt' tadi

Windows Explorer Search History

Windows Explorer Search History terletak pada key HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\WordWheelQuery

Sebelum nya saya mencari pada windows explorer dengan keyword "ebook file", dan keyword tersebut  langsung tercatat pada key WordWheelQuery.

Running Count And Last Execution date and time

History Running Count And Last Execution date and time, terletak pada key HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\UserAssist, yang dimana key UserAssist akan menampilkan berapa kali program dijalankan dan kapan waktu terakhir program tersebut dijalankan.

Susunan UserAssist :
  •     Windows XP
        {5E6AB780-7743-11CF-A12B-00AA004AE837}
            Count
        {75048700-EF1F-11D0-9888-006097DEACF9}
            Count
  • Windows 7, 8, 10
        {CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}
            Count
        {F4E57C4B-2036-45F0-A9AB-443BCFE33D9F}
            Count
* Setiap Value pada subkey "Count" di encode dengan Rot-13.

Saya akan mecoba cari tahu berapa kali "Mozilla Firefox" dijalankan pada System, "Mozilla Firefox" apabila di konversi ke rot13 akan menjadi "Zbmvyyn Sversbk"

Mozilla Firefox dijalankan sebanyakan 8 kali sesuai dengan nilai yang ada pada offset 0x04.

Catatan Penting :

Pada value MRUListEx setiap data nya memiliki ukuran 4 bytes tersimpan dalam little indian. Setiap bagian yang paling kiri adalah yang paling terakhir dibuka/dijalankan.

[to..be..continue]......


Sebelumnya mohon maaf apabila ada salah pemberian definisi. Dan semoga postingan ini dapat bermanfaat bagi kita semua.


referensi :

https://digital-forensics.sans.org/blog/2010/04/02/openrunsavemru-lastvisitedmru/
https://msdn.microsoft.com/en-us/library/windows/desktop/ms724877(v=vs.85).aspx
http://www.4n6k.com/2015/05/forensics-quickie-ntuserdat-analysis.html

14 September 2016

Menulis Dan Membaca File Pada Bahasa C


Sudah cukup lama tidak update postingan pada blog ini, oleh karena itu, pada postingan kali ini saya akan coba share mengenai Cara Menulis Dan Membaca File Pada Bahasa C.

Sama seperti bahasa pemrograman lain nya, C sendiri mempunyai mode dalam operasi file


Menulis File Pada C

Buatlah file baru dengan nama write_to_file.c,

Keterangan :

FILE *file_to_write : untuk membuat pointer pada class file sehingga bisa menangkap nilai return dari fungsi fopen()
fopen() : fungsi yang digunakan untuk membuat suatu file, apabila file tsb tidak ada akan dibuat baru ( sesuai dengan mode yang digunakan )
fputs() : fungsi yang digunakan untuk menulis string pada suatu file
fclose() : fungsi yang digunakan untuk menutup file

Compile dan jalankan script tersebut,
rh4ma@kali:~/Desktop$ gcc write_to_file.c -o write_to_file
rh4ma@kali:~/Desktop$ ./write_to_file
rh4ma@kali:~/Desktop$ cat only_one.txt
There is no god but ALLAH swt

Membaca File Pada C

 Buatlah file baru dengan nama read_to_file.c,


Keterangan :
fgets() : merupakan fungsi kebalikan dari fputs, yaitu untuk mendapatkan string pada suatu file, dmn pada fungsi fgets() mempunyai 3 paramter yaitu, 1. variable yang menampung string, 2. banyak byte/charakter yang akan didapatkan, 3. stream file atau file yang telah dibuka menggunakan fopen()

Compile dan jalankan script tersebut,
rh4ma@kali:~/Desktop$ gcc read_to_file.c -o read_to_file
rh4ma@kali:~/Desktop$ ./read_to_file
There is no god but ALLAH swt

Sekian tutorial sederhana dari saya, mohon maaf apabila ada salah pemberian definisi dan semoga tutorial ini bermanfaat bagi kita semua.

7 Agustus 2016

[PDF Forensic] Tutorial Analysis "Malicious" PDF File


assalamualaikum..

Tutorial Analsys "Malicious" PDF File - Terkadang kita sering mendownload ebook dengan filetype PDF tanpa memperhatikan apakah file PDF tersebut benar-benar aman atau ada sebuah code yang mencurigakan. Oleh karena itu saya membuat posting ini agar kita selalu berhati-hati dalam mendownload berbagai file sehingga tidak terjadi hal yang tidak diinginkan saat mengeksekusi file tersebut.

Tool Yang Digunakan Untuk PDF Forensic
  • pdfid
  • pdf-parser
  • peepdf
Saya menggunakan exploit adobe_collectemailinfo yang tersedia di metasploit sebagai bahan uji coba. perlu diketahui saya disini tidak membahas exploit nya.
Scanning PDF Keyword dengan pdfid
Dimana step ini dibutuhkan untuk mengidentifikasi apakah terdapat berbagai Action tertentu saat file PDF dibuka.

Tutorial Analsys "Malicious" PDF File

/JS & /Javascript : file pdf mengandung code javascript yang akan dieksekusi
/AA (Additional Action) atau /OpenAction : akan otomatis mengeksekusi Action atau script tertentu saat file dibuka.

Analsys PDF Dengan pdf-parser
Setelah melakukan scanning, tahap selanjut nya adalah dengan meneliti alur dari OpenAction agar kita dapat mengetahui object mana saja yang dilewati saat file PDF tersebut dibuka.
pdf-parser --search=OpenAction malicious.pdf
Tutorial Analsys "Malicious" PDF File
OpenAction Merujuk atau mengarah ke object 5
Ikuti ke object 5
pdf-parser --object=5 malicious.pdf
Tutorial Analsys "Malicious" PDF File
JS mengarah ke object 6
Lalu ikuti lagi menuju object 6
pdf-parser --object=6 malicious.pdf
Tutorial Analsys "Malicious" PDF File
Pada object 6 terdapat filter, filter digunakan untuk mengompress.
Hex String : /Fl#61t#65#44#65co#64e/A#53#43I#49#48#65#78D#65c#6fde apabila didecode akan menghasilkan /FlateDecode /ASCIIHexDecode.

Untuk melihat isi dari konten yang compress :
pdf-parser --object=6 --filter malicious.pdf
Tutorial Analsys "Malicious" PDF File
Hore, ternyata itu javascript yang kita cari.
 Apabila script JS tersebut ingin diDump dapat menggunakan command
pdf-parser --object=6 --filter --raw --dump=/path/to/dir/ malicious.pdf
Analsys PDF Dengan peepdf

Sama hal nya seperti pdf-parser, peepdf tool yang digunakan untuk pdf forensic.
Langsung saja, gunakan peepdf dalam interactive mode
 peepdf -i malicious.pdf
Tutorial Analsys "Malicious" PDF File

"Suspicious Element" nya langsung ditemukan,dan karena file yang "malicious.pdf" yang saya gunakan sama dengan saat menggunakan pdf-parser alur nya sudah kita ketahui, jadi langsung saja menuju object 6 dimana terdapat "Objects with JS code".
object 6
Tutorial Analsys "Malicious" PDF File
Apabila ingin didump jalankan perintah dibawah ini ( di interactice mode ) :
set output file /path/to/dir
object 6

Sekian tutorial sederhana dari saya, semoga dapat bermanfaat bagi kita semua, dan saya  mohon maaf apabila ada salah dalam pemberian definisi maupun penjelasan.

30 Juli 2016

PEMBAHASAN SOAL LEVEL 1 CDC 2015 OFFLINE - POST.PCAPNG


assalamualaikum...

saya akan mencoba membahas soal forensic cdc offline 2015.

soal nya dapat didownload disini :

Soal Offline
Pass : soalcdcoffline
sumber soal : forum.explorecrew.org

Soal Level 1. post
Detail Soal :post.pcapngmd5 : af3a6981ee165752824c439ae420c31a
extensi file tersebut adalah .pcapng yang merupakan packet capture,  so langsung saja kita buka dengan wireshark..

[Image: YDBIJFK.png]
terdapat banyak paket, dan sayamulai mencurigai bahwa ini merupakan network sniffing, lalu filter http pada paket tsb

[Image: AjwbHWC.png]
Terdapat banyak request dengan method GET, kalau gitu mari kita inget, nama soal nya adalah post.pcapng , haha tau kan mksd saya kek gmn ? yaa bisa aja itu adalah clue bahwa terdapat request dengan method POST pada paket tsb, mari kita filter POST request dengan :

Quote:http.request.method eq POST
[Image: 3rXvbLM.png]
terdapat 6 paket dengan request POST

dan pada saat itu sayaspontan mengira kalau value dari authenticity_token adalah string base64 yang merupakan flag, tapi ternyata ZONKKK !!
[Image: ebBlrsn.png]

[Image: dpYbeME.png]

selanjut kita dapat melihat form user[password] yang sangat mencurigakan, so langsung saja kita ambil nilai2 dari form user[password]
[Image: uiiAAOr.png]
lalu mari kita salin semua nilai dari paket yang terdapat form user[password], hingga hasil nya : 

Quote:packet number 3280 : 466c6167206e79
packet number 3483 : KOSONG
packet number 3627 : 61206164616c61
packet number 11714 : 68203a2053316d
packet number 12497 :  kita lewati, karen fokus pada form user[password]
packet number 12593 : 706c3368337840
kita susun baik2 dulu 

Quote:466c6167206e79
61206164616c61
68203a2053316d
706c3368337840
saya rasa ini adalah hex decimal, jadi mari kita decode dengan command xxd pada linux..

[Image: UDuKpPb.png]

Flag nya adalah : S1mpl3h3x@

selain menggunakan cara diatas, sebenar nya ada cara paling mudah
kita perlu menggunakan strings lalu filter simbol2 tertentu

Quote:strings post.pcapng | grep flag | cut -d'=' -f5 | cut -d'&' -f1
[Image: aNit8WB.png]

Tinggal di decode aja 

sekian write up sederhana dari saya, mohon maaf kalau ada salah pemberian definisi dan maaf juga kalau penjelesannya banyak yang missed..