__ __ /\ \ ___ ___ ___ __ __ __ ___ _ __ /\_\ \_\ \ / __`\ /' __` __`\ /'__`\ /'_ `\ /'__`\ / __`\/\`'__\ \/\ \ /'_` \ /\ \L\ \/\ \/\ \/\ \/\ __//\ \L\ \/\ \L\.\_ __/\ \L\ \ \ \/ __\ \ \/\ \L\ \ \ \____/\ \_\ \_\ \_\ \____\ \____ \ \__/.\_\/\_\ \____/\ \_\/\_\\ \_\ \___,_\ \/___/ \/_/\/_/\/_/\/____/\/___L\ \/__/\/_/\/_/\/___/ \/_/\/_/ \/_/\/__,_ / /\____/ \_/__/ OMEGA|ZINE RELEASE 04 Author : Cakill Schumbag || eyecry.satriani09[at]gmail[dot]com Online @ www.omega.or.id :: http://ezine.omega.or.id == Hacking - implementasi buffer overflow (loading shellcode) == PRELUDE ------- Pengertian buffer overflow: kita akan manipulasi register EIP dengan program yang kita buat melalui cara buffering terhadap kapasitas memory itu sendiri EIP adalah register di mesin 32bit yang berfungsi menyimpan alamat memory yang akan menjalankan instruksi selanjutnya. START ----- di sini saya mempunyai source exploit dengan shellcodenya schumbag@ngelux:~$ cat ngenes.c #include char shellcode[] = "\xbb\x14\x00\x00\x00" "\xb8\x01\x00\x00\x00" "\xcd\x80"; int main() { int *ret; ret = (int *)& ret +2; (*ret) = (int)shellcode; } schumbag@ngelux:~$ lalu kita compile dengan opsi gcc -ggdb -mpreferred-stack-boundary=2 -o ngenes ngenes.c kemudian run schumbag@ngelux:~$ ./ngenes schumbag@ngelux:~$ masih tak terjadi apa-apa,coba tambahkan perintah.... schumbag@ngelux:~$ echo $? 20 schumbag@ngelux:~$ ~sedikit saya jelaskan mengenai struktur manipulasi terhadap memorynya pertama kita akan melakukan eksekusi file untuk overwrite hingga 12byte di register RET ~lalu melakukan hal yang sama untuk 4bytes di register EIP ~dan kembali ke register RET ~untuk kemudian eksekusi function hingga over yang memberi nilai baru di RET untuk instruksi selanjutnya.... kira-kira seperti inilah gambaran simpelnya : ====== | RET | ======= |EBP-old| ======= |Buffer[]| | 8 Bytes| <===== ESP ========== di balik fungsi tersebut terdapat space 20bit yang di alokasikan ke RET dan dan di stack ketika running EBP-old instruction pointer yang akan di insert di function tersebut. sekarang kita akan debugging menggunakan gdb schumbag@ngelux:~$ gdb ./ngenes GNU gdb (GDB) 7.2-ubuntu Copyright (C) 2010 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "i686-linux-gnu". For bug reporting instructions, please see: ... Reading symbols from /home/schumbag/ngenes...done. (gdb) disas main Dump of assembler code for function main: 0x08048394 <+0>: push %ebp 0x08048395 <+1>: mov %esp,%ebp 0x08048397 <+3>: sub $0x4,%esp 0x0804839a <+6>: lea -0x4(%ebp),%eax 0x0804839d <+9>: add $0x8,%eax 0x080483a0 <+12>: mov %eax,-0x4(%ebp) 0x080483a3 <+15>: mov -0x4(%ebp),%eax 0x080483a6 <+18>: mov $0x804a010,%edx 0x080483ab <+23>: mov %edx,(%eax) 0x080483ad <+25>: leave 0x080483ae <+26>: ret End of assembler dump. (gdb) di sinilah letak register program ketika di execute 0x0804839d <+9>: add $0x8,%eax lalu coba untuk kita list lagi (gdb) list 1 #include 2 3 char shellcode[] = "\xbb\x14\x00\x00\x00" 4 "\xb8\x01\x00\x00\x00" 5 "\xcd\x80"; 6 7 int main() 8 { 9 int *ret; 10 ret = (int *)& ret +2; (gdb) [baca:enter lagi] 11 (*ret) = (int)shellcode; 12 } (gdb) coba break di line 12 kemudian jalankan kembali (gdb) break 10 Breakpoint 1 at 0x804839a: file ngenes.c, line 10. (gdb) run Starting program: /home/schumbag/ngenes Breakpoint 1, main () at ngenes.c:10 10 ret = (int *)& ret +2; sekarang kita tes stacknya (gdb) x/8xw $esp 0xbffff3d4: 0x00000000 0xbffff458 0xb7e86ce7 0x00000001 0xbffff3e4: 0xbffff484 0xbffff48c 0xb7fe0848 0xbffff530 ---------- |INTERLUDE| ---------- masing-masing di sini menunjukkan stack terhadap heap ketika file pointer di alokasikan sekarang liat di ret (gdb) print /x ret $1 = 0x0 "0x00000000" menunjukkan lokasi local variabel ret pointer di stack define,dan lokasi "0xbffff458" mengarah ke local variable di ebp dan inilah lokasi address yang di tuju "0xb7e86ce7" di register EIP seep,kita lanjoootttt buat cari addressnya (gdb) disas 0xb7e86ce7 Dump of assembler code for function __libc_start_main: 0xb7e86c00 : push %ebp 0xb7e86c01 : mov %esp,%ebp 0xb7e86c03 : push %edi 0xb7e86c04 : push %esi 0xb7e86c05 : push %ebx 0xb7e86c06 : call 0xb7e86b1f 0xb7e86c0b : add $0x1423e9,%ebx 0xb7e86c11 : sub $0x6c,%esp 0xb7e86c14 : mov 0x14(%ebp),%esi 0xb7e86c17 : mov 0x1c(%ebp),%eax 0xb7e86c1a : mov -0x108(%ebx),%edx 0xb7e86c20 : test %edx,%edx 0xb7e86c22 : je 0xb7e86cef <__libc_start_main+239> 0xb7e86c28 : xor %ecx,%ecx 0xb7e86c2a : mov (%edx),%edx 0xb7e86c2c : test %edx,%edx 0xb7e86c2e : sete %cl 0xb7e86c31 : mov -0x40(%ebx),%edx 0xb7e86c37 : test %eax,%eax 0xb7e86c39 : mov %ecx,(%edx) ---Type to continue, or q to quit---quit Quit (gdb) semua terdapat function __libc_start_main untuk pemangilan program dan pemanggilan fungsi itu sendiri karena ebp stack telah di pindah terlebih dulu untuk register %esp dan sekarang kita coba untuk basic stack dari frame function __libc__start__main untuk overwrite address ini 0xb7e86ce7 mari kita lihat kembali source codenya schumbag@ngelux:~$ cat ngenes.c #include char shellcode[] = "\xbb\x14\x00\x00\x00" "\xb8\x01\x00\x00\x00" "\xcd\x80"; int main() { int *ret; ret = (int *)& ret +2; (*ret) = (int)shellcode; } schumbag@ngelux:~$ terutama di variabel ret = (int *)& untuk instruksi selanjutnya yang menunjukkan lokasi ret di 0xbffff3d4 yaitu stack dan pointer yang menambah +2 memberi nilai 8bytes integer local variabel yang telah di overwrite di "0xbffff458" dari variabel ret dan instruksi terakhir (*ret) = (int)shellcode; mereplace di address tersebut. mari kita coba dengan instruksi (gdb) s 11 (*ret) = (int)shellcode; dan coba lagi hasil dari relocate fungsi variable tadi (gdb) x/8xw $esp 0xbffff3d4: 0xbffff3dc 0xbffff458 0xb7e86ce7 0x00000001 0xbffff3e4: 0xbffff484 0xbffff48c 0xb7fe0848 0xbffff530 point nya ketemu di 0xbffff3dc dan stack buffer telah terjadi di 0xbffff3d4: dan disini number location nya 0xb7e86ce7 instruksi selanjutnya shellcode ada di sini juga 0xb7e86ce7 sekarang tes kembali print shellcodenya (gdb) print &shellcode $2 = (char (*)[13]) 0x804a010 ini addressnya 0x804a010 pilih instruksi untuk mengetahui locate stacknya (gdb) s 12 } (gdb) x/8xw $esp 0xbffff3d4: 0xbffff3dc 0xbffff458 0x0804a010 0x00000001 0xbffff3e4: 0xbffff484 0xbffff48c 0xb7fe0848 0xbffff530 udah di overwrite di addres shellcodenya,coba perhatikan dengan yang pertama,menandakan address yang berbeda coba di disas lagi,apa masih menampilkan yang sama seperti tadi (function __libc__start__main) hanya saja sedikit berbeda dengan routine shellcode tadi yaitu : 0x0804a010 (gdb) disas 0x0804a010 Dump of assembler code for function shellcode: 0x0804a010 : mov $0x14,%ebx 0x0804a015 : mov $0x1,%eax 0x0804a01a : int $0x80 0x0804a01c : add %al,(%eax) End of assembler dump. (gdb) kita eksekusi lagi program (gdb) c Continuing. Program exited with code 024. (gdb) Kesimpulan ---------- artikel ini adalah demo paling simpel bagaimana buffer overflow bekerja dengan shellcode yang di injeksiken ke exploit penetrasi macam ini bukanlah teknik tingkat tinggi untuk mendapatkan akses root seperti biasanya namun di sini menerangkan implementasi b0f bekerja di sebuah sistem FadeOut ------- Semoga paper yang simpel ini bisa memberi gambaran dan mampu memberi penjelasan gamblang bagi para pembaca yang juga memberi pengalaman dan pelajaran bagi penulis. Referensi --------- http://www.safemode.org/files/zillion/shellcode/doc/Writing_shellcode.html (Writing Shellcode) http://penturalabs.wordpress.com/2011/04/02/vulnerability-development-buffer-overflows-how-to-bypass-non-executable-stack-nx/ (How to bypass non executable) http://pastebin.com/ZenZFVGp (ASM SecurityTube) http://insecure.org/stf/smashstack.html (Smashing for fun and profit by aleph one) http://purecode.pl/blog/?p=48 (Algorithmic runtime) *greetz to: omicron and all omega.or.id Team (Salam kenal semua...) ketek,syn_attack,nofia_fitri,wenkhairu,mywisdom,petimati,chaer_newbie,ditatompel,ade yonatan,v3n0m,eidelweiss,adoet [R.I.P]peri.carding,all staff && crew devilzc0de team devilzc0de,jasakom,surabaya hackerlink,[R.I.P] irc.dist0rsi.biz kritik && saran kirimkan ke eyecry.satriani09[at]gmail[dot]com