Implementasi buffer overflow


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 shellcodenyaschumbag@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.ckemudian 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    b60f140757e1d337f303914a7af21f28x4,%esp
   0x0804839a <+6>:	lea    -0x4(%ebp),%eax
   0x0804839d <+9>:	add    b60f140757e1d337f303914a7af21f28x8,%eax
   0x080483a0 <+12>:	mov    %eax,-0x4(%ebp)
   0x080483a3 <+15>:	mov    -0x4(%ebp),%eax
   0x080483a6 <+18>:	mov    b60f140757e1d337f303914a7af21f28x804a010,%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    b60f140757e1d337f303914a7af21f28x8,%eaxlalu 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 alokasikansekarang liat di ret 
(gdb) print /x ret
 = 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 EIPseep,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    b60f140757e1d337f303914a7af21f28x1423e9,%ebx
   0xb7e86c11 <function __libc_start_main+17>:	sub    b60f140757e1d337f303914a7af21f28x6c,%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 0xb7e86ce7mari kita lihat kembali source codenyaschumbag@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	0xbffff530point nya ketemu di 0xbffff3dc dan stack buffer telah terjadi di 0xbffff3d4: dan disini number location nya 0xb7e86ce7instruksi selanjutnya shellcode ada di sini juga 0xb7e86ce7
sekarang tes kembali print shellcodenya(gdb) print &shellcode
 = (char (*)[13]) 0x804a010ini addressnya 0x804a010pilih instruksi untuk mengetahui locate stacknya
(gdb) s
12	}
(gdb) x/8xw $esp
0xbffff3d4:	0xbffff3dc	0xbffff458	0x0804a010	0x00000001
0xbffff3e4:	0xbffff484	0xbffff48c	0xb7fe0848	0xbffff530udah di overwrite di addres shellcodenya,coba perhatikan dengan yang
pertama,menandakan address yang berbedacoba 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    b60f140757e1d337f303914a7af21f28x14,%ebx
   0x0804a015 <shellcode+5>:	mov    b60f140757e1d337f303914a7af21f28x1,%eax
   0x0804a01a <shellcode+10>:	int    b60f140757e1d337f303914a7af21f28x80
   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 sistemFadeOut
-------
Semoga paper yang simpel ini bisa memberi gambaran
dan mampu memberi penjelasan gamblang bagi para pembaca
yang juga memberi pengalaman dan pelajaran bagi penulis.
0.00 / 0 votes

In order to comment, please sign in

Comments


Loading

Testimonials


User Menu