nebeng lagi.. numpang mindahin source tutor gw ksni.. klo mau bc lgsg bs kesini uda lama bnget gw post2 di forum IT lain yg bgnian..ok back to topic
Sedikit memberikan tambahan dari part 1 sebelumnya mengenai buffer overflow & shellcode..
banyak yang bertanya, bagaimana membuat shellcode??..ok saya coba jelaskan tahapan2 untuk membuat shellcode yg simple..
================================================== ==================
1. apa itu shellcode?
shellcode yang sering kita lihat pada exploit2 script berbentuk seperti code acak dalam bilangan hexa..(0-f)
cth bentuk shellcode :
Code:
\x31\xc0\x99\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80
tidak bisa diterjemahkan dan dimengerti bukan?..sebenarnya jika code ini disisipkan ke dalam sebuah script dengan bahasa pemrograman seperti C,perl,python,dll akan menyebabkan intruksi sebuah perintah tertentu..dengan memanfaatkan buffer kita bisa menyisipkan shellcode ini untuk mengitruksi sebuah perintah yg kita inginkan, dan jadilah buffer overflow exploit =p
ok! lgsg ke inti permasalahan..
2. bagaimana membuat shellcode?
ada beberapa cara untuk menyusun shellcode ini.. disini saya coba jelaskan 2 cara (rata2 memang cara ini yg sering digunakan).. dengan debuging dan bantuan tools penerjemah.
*) yang dibutuhkan dalam pembuatan shellcode dengan cara debugging antara lain :
- kemampuan C programing (standar2 aja, ga perlu expert)
- GDB (GNU debugger)
- mengerti assembly (stack register dan interuption dasar pada register)
ok langsung saya contohkan dengan kasus kita ingin membuat shellcode untuk mengintruksi fungsi write dengan bahasa C.. saya beri nama file ini : jasakom.c
(sory klo bawa merk, ini bekas gw kasih tutor di jasakom)
Code:
main() {
write(1,"jasakom\n",8);
}
mari kita coba compile dengan perintah :
Code:
root@bloodiez:/# gcc -o jasakom jasakom.c
tes eksekusi dgn perintah:
Code:
root@bloodiez:/# ./jasakom
jasakom
kita sudah buat file tersebut sekarang kita debug file tersebut..sebelumnya compile dengan menggunakan flag -static kemudian gunakan gdb utk debug seperti dbwh ini :
root@bloodiez:/# gcc -o jasakom -static jasakom.c
root@bloodiez:/# gdb jasakom
bla-bla-bla-bla
(gdb) disas main //debug main program
Dump of assembler code for function main:
0x08048208 <main+0>: lea 0x4(%esp),%ecx
0x0804820c <main+4>: and $0xfffffff0,%esp
0x0804820f <main+7>: pushl 0xfffffffc(%ecx)
0x08048212 <main+10>: push %ebp
0x08048213 <main+11>: mov %esp,%ebp
0x08048215 <main+13>: push %ecx
0x08048216 <main+14>: sub $0x14,%esp
0x08048219 <main+17>: movl $0x8,0x8(%esp)
0x08048221 <main+25>: movl $0x809fae8,0x4(%esp) <---alamat yg menyimpan kata "jasakom\n", bisa di tes dengan menggunakan (gdb) x/s 0x809fae8
0x08048229 <main+33>: movl $0x1,(%esp)
0x08048230 <main+40>: call 0x804e190 <write> <---memanggil fungsi write
0x08048235 <main+45>: add $0x14,%esp
0x08048238 <main+48>: pop %ecx
0x08048239 <main+49>: pop %ebp
0x0804823a <main+50>: lea 0xfffffffc(%ecx),%esp
0x0804823d <main+53>: ret
End of assembler dump.
(gdb) disas write //debug function write
Dump of assembler code for function write:
0x0804e190 <write+0>: cmpl $0x0,%gs:0xc
0x0804e198 <write+8>: jne 0x804e1bb
0x0804e19a <__write_nocancel+0>: push %ebx
0x0804e19b <__write_nocancel+1>: mov 0x10(%esp),%edx
0x0804e19f <__write_nocancel+5>: mov 0xc(%esp),%ecx
0x0804e1a3 <__write_nocancel+9>: mov 0x8(%esp),%ebx
0x0804e1a7 <__write_nocancel+13>: mov $0x4,%eax
0x0804e1ac <__write_nocancel+18>: int $0x80 <--interupt terakhir dalam write function. gunakan ini untuk mengetahui nilai eax,ebx,ecx dan edx nantinya
0x0804e1ae <__write_nocancel+20>: pop %ebx
0x0804e1af <__write_nocancel+21>: cmp $0xfffff001,%eax
0x0804e1b4 <__write_nocancel+26>: jae 0x804fe60 <__syscall_error>
0x0804e1ba <__write_nocancel+32>: ret
0x0804e1bb: call 0x804ef50 <__libc_enable_asynccancel>
0x0804e1c0: push %eax
0x0804e1c1: push %ebx
0x0804e1c2: mov 0x14(%esp),%edx
0x0804e1c6: mov 0x10(%esp),%ecx
0x0804e1ca: mov 0xc(%esp),%ebx
0x0804e1ce: mov $0x4,%eax
0x0804e1d3: int $0x80
0x0804e1d5: pop %ebx
0x0804e1d6: xchg %eax,(%esp)
---Type <return> to continue, or q <return> to quit---
0x0804e1d9: call 0x804ef20 <__libc_disable_asynccancel>
0x0804e1de: pop %eax
0x0804e1df: cmp $0xfffff001,%eax
0x0804e1e4: jae 0x804fe60 <__syscall_error>
0x0804e1ea: ret
End of assembler dump.
(gdb)break *0x0804e1ac <--breakdown alamat registry interupt write function
Breakpoint 1 at 0x804e1ac
(gdb) r
Starting program: /home/bloodiez/asemblylearn/jasakom
Breakpoint 1, 0x0804e1ac in __write_nocancel ()
(gdb) i r eax ebx ecx edx <--cek nilai dari eax,ebx,ecx,edx
eax 0x4 4
ebx 0x1 1
ecx 0x809fae8 134871784
edx 0x8 8
(gdb)
nah..sekarang kita buat source assembly dgn C utk program sederhana ini. kita beri nama filenya : jasakomasm.c
Code:
main() {
__asm__("mov $0x9,%edx\n\t" //nilai edx dari debug=8, kita tambah 1 untuk menyesuaikan byte penulisan karakter (lihat push $0x73616a <-- kurang 1 byte)
"push $0xa\n\t" //simpan 0xa ke stack. 0xa = linefeed (lihat tabel ascii)
"push $0x6d6f6b61\n\t" //simpan nilai 0x6d6f6b61 ke stack. 0x6d6f6b61="moka" lihat ascii tabel (penyimpanan menggunakan LIFO, baca dari belakang ke depan)
"push $0x73616a\n\t" //simpan nilai 0x73616a ke dalam stack. 0x73616a="saj"
"mov %esp,%ecx\n\t" //copy nilai esp ke ecx dimana ecx merupakan alamat dari kata "jasakom\n"
"mov $0x1,%ebx\n\t" //ebx = 1 (lihat debug)
"mov $0x4,%eax\n\t" //eax = 4 (lihat debug)
"int $0x80\n\t" //interupt process
"mov %ebx,%ebx\n\t" //ebx=0
"mov $0x1,%eax\n\t" //eax=1 (ini merupakan syscall utk exit..bisa baca kembali buku2 assembly nya)
"int $0x80"); //interupt process
}
ok kita tes compile dan jalankan..
Code:
root@bloodiez:/# gcc -o jasakomasm jasakomasm.c
root@bloodiez:/# ./jasakomasm
jasakom
root@bloodiez:/#
sekarang pembuatan shellcodenya..buka kembali "jasakomasm" dengan gdb
root@bloodiez:/#gdb jasakomasm
bla-bla-bla
(gdb) disas main
Dump of assembler code for function main:
0x08048344 <main+0>: lea 0x4(%esp),%ecx
0x08048348 <main+4>: and $0xfffffff0,%esp
0x0804834b <main+7>: pushl 0xfffffffc(%ecx)
0x0804834e <main+10>: push %ebp
0x0804834f <main+11>: mov %esp,%ebp
0x08048351 <main+13>: push %ecx
0x08048352 <main+14>: mov $0x9,%edx <--ingat pada saat pembuatan assembly code..ini merupakan state awal dimana anda menulis assembly
0x08048357 <main+19>: push $0xa
0x08048359 <main+21>: push $0x6d6f6b61
0x0804835e <main+26>: push $0x73616a
0x08048363 <main+31>: mov %esp,%ecx
0x08048365 <main+33>: mov $0x1,%ebx
0x0804836a <main+38>: mov $0x4,%eax
0x0804836f <main+43>: int $0x80
0x08048371 <main+45>: mov %ebx,%ebx
0x08048373 <main+47>: mov $0x1,%eax
0x08048378 <main+52>: int $0x80 <---state akhir
0x0804837a <main+54>: pop %ecx
0x0804837b <main+55>: pop %ebp
0x0804837c <main+56>: lea 0xfffffffc(%ecx),%esp
0x0804837f <main+59>: ret
End of assembler dump.
(gdb) x/b main+14 <--lihat diatas bahwa state awal dimulai dari main+14
0x8048352 <main+14>: 0xba <--inilah shellcodenya..lakukan dari state awal hingga akhir
(gdb) x/b main+15
0x8048353 <main+15>: 0x09
(gdb)
dengan cara ini didapat shellcodenya sebagai berikut :
Code:
\xba\x09\x00\x00\x00\x6a\x0a\x68\x61\x6b\x6f\x6d\x68\x6a\x61\x73\x00\x89\xe1\xbb\x01\x00\x00"
\x00\xb8\x04\x00\x00\x00\xcd\x80\x89\xdb\xb8\x01\x00\x00\x00\xcd\x80
ok kita sudah punya shellcode intuk intruksi write "jasakom", perlu diketahui lebih lanjut, dalam penulisan shellcode utk exploit buffer, tidak dianjurkan terdapat code "/x00" karena ini akan membuat process di interupt..utk menghilangkannya bisa memanipulasi code assembly hingga tidak terdapat code shell "/x00" (saya tidak akan membahas ini karena nantinya jadi pembelajaran assembly)..
next.. kita coba tulis shellcode ini ke bahasa C intuk di intruksi. kita beri nama filenya : jasakomshell.c
Code:
char shell[]="\xba\x09\x00\x00\x00\x6a"
"\x0a\x68\x61\x6b\x6f\x6d"
"\x68\x6a\x61\x73\x00"
"\x89\xe1\xbb\x01\x00\x00"
"\x00\xb8\x04\x00\x00\x00"
"\xcd\x80\x89\xdb\xb8\x01"
"\x00\x00\x00\xcd\x80";
main() {
void (*s) (void);
s=(void*)shell;
s();
}
ok kita coba compile dan jalankan.. apakah hasilnya sama dengan script2 sebelumnya?
Code:
root@bloodiez:/# gcc -o jasakomshell jasakomshell.c
root@bloodiez:/# ./jasakomshell
jasakom
NICE!.. sukses ^^
tadinya gw mau kasi ss ny.. berhubung ni topic udh lama n account tmpt gw upload di suspend jd ga da ssny ya.. tp dah jelas kok itu ^ ^
cara selain menggunakan gdb pun bisa dilakukan dengan "objdump"
root@bloodiez:/# objdump -d jasakomasm | grep \<main\> -A17 (-A17=banyaknya line yg ingin ditampilkan=17)
08048344 <main>:
8048344: 8d 4c 24 04 lea 0x4(%esp),%ecx
8048348: 83 e4 f0 and $0xfffffff0,%esp
804834b: ff 71 fc pushl -0x4(%ecx)
804834e: 55 push %ebp
804834f: 89 e5 mov %esp,%ebp
8048351: 51 push %ecx
8048352: ba 09 00 00 00 mov $0x9,%edx <--state awal
8048357: 6a 0a push $0xa
8048359: 68 61 6b 6f 6d push $0x6d6f6b61
804835e: 68 6a 61 73 00 push $0x73616a
8048363: 89 e1 mov %esp,%ecx
8048365: bb 01 00 00 00 mov $0x1,%ebx
804836a: b8 04 00 00 00 mov $0x4,%eax
804836f: cd 80 int $0x80
8048371: 89 db mov %ebx,%ebx
8048373: b8 01 00 00 00 mov $0x1,%eax
8048378: cd 80 int $0x80 <---state akhir
catat semua bilangan hexa dari state awal sampai akhir (ba=\xba, dst..)
by.bLoodiEz a.k.a b1nary_g333k5/c0mrade
================================================== ==================
semoga berguna..^^ anda bisa membuat shellcode lain misal untuk memanggil shell prompt sebuah sistem operasi,dll.. happy shellcoding ^^..
nb: sory klo ga gw post di forum programming,. ini sbnernya cm info mengenai shellcode tp diiringi sm pembuatan shellcode sederhana
Share This Thread