Language:

Search

Implementasi buffer overflow

  • Share this:
post-title
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<stdio.h>

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 <http://gnu.org/licenses/gpl.html>
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:
<http://www.gnu.org/software/gdb/bugs/>...
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<stdio.h>
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 <function __libc_start_main+0>:	push   %ebp
   0xb7e86c01 <function __libc_start_main+1>:	mov    %esp,%ebp
   0xb7e86c03 <function __libc_start_main+3>:	push   %edi
   0xb7e86c04 <function __libc_start_main+4>:	push   %esi
   0xb7e86c05 <function __libc_start_main+5>:	push   %ebx
   0xb7e86c06 <function __libc_start_main+6>:	call   0xb7e86b1f
   0xb7e86c0b <function __libc_start_main+11>:	add    $0x1423e9,%ebx
   0xb7e86c11 <function __libc_start_main+17>:	sub    $0x6c,%esp
   0xb7e86c14 <function __libc_start_main+20>:	mov    0x14(%ebp),%esi
   0xb7e86c17 <function __libc_start_main+23>:	mov    0x1c(%ebp),%eax
   0xb7e86c1a <function __libc_start_main+26>:	mov    -0x108(%ebx),%edx
   0xb7e86c20 <function __libc_start_main+32>:	test   %edx,%edx
   0xb7e86c22 <function __libc_start_main+34>:	je     0xb7e86cef <__libc_start_main+239>
   0xb7e86c28 <function __libc_start_main+40>:	xor    %ecx,%ecx
   0xb7e86c2a <function __libc_start_main+42>:	mov    (%edx),%edx
   0xb7e86c2c <function __libc_start_main+44>:	test   %edx,%edx
   0xb7e86c2e <function __libc_start_main+46>:	sete   %cl
   0xb7e86c31 <function __libc_start_main+49>:	mov    -0x40(%ebx),%edx
   0xb7e86c37 <function __libc_start_main+55>:	test   %eax,%eax
   0xb7e86c39 <function __libc_start_main+57>:	mov    %ecx,(%edx)
---Type <return> to continue, or q <return> 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<stdio.h>

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 <shellcode+0>:	mov    $0x14,%ebx
   0x0804a015 <shellcode+5>:	mov    $0x1,%eax
   0x0804a01a <shellcode+10>:	int    $0x80
   0x0804a01c <shellcode+12>:	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
Armin

Armin

IT Dev, SEO & Digital Marketing Specialist with 7+ years experience, Coder, Sys Admin, Designer, Blogger