Results 1 to 3 of 3
http://idgs.in/195030
  1. #1

    Join Date
    May 2008
    Location
    /proc/sys/kernel/randomize_va_space
    Posts
    875
    Points
    1,326.90
    Thanks: 0 / 13 / 8

    Default [adv introduction+tutor] membuat shellcode utk injeksi buffer sederhana

    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
    Last edited by bl00d13z; 09-05-09 at 01:36.

  2. Hot Ad
  3. #2
    koker123's Avatar
    Join Date
    Jan 2007
    Location
    Somewhere on Earth
    Posts
    838
    Points
    993.90
    Thanks: 1 / 2 / 2

    Default

    ea anak jasakom nih...

    siggynya d pake tuh jadi contoh wkwkwkwkw

  4. #3

    Join Date
    May 2008
    Location
    /proc/sys/kernel/randomize_va_space
    Posts
    875
    Points
    1,326.90
    Thanks: 0 / 13 / 8

    Default

    Quote Originally Posted by koker123 View Post
    ea anak jasakom nih...

    siggynya d pake tuh jadi contoh wkwkwkwkw
    huehue.. anak emak gw lah yg pasti,.
    ga jasakom aj sih, cm kbneran tutor gw yg ini ditarony cm dijasakom, mau edit cthny jadi indogamers, kbru ngantuk..hueheu ngpostny ud 5 watt itu

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •