bagi para master baiknya gak usah baca tulisan ini... nanti buang2 waktu anda yag berharga...
tulisan ini hanya untuk para pemula seperti saya yang ingin belajar... ^_^
pertama2 kita buat dulu messagebox dalam bahasa assembly, tetentunya buat tanpa menggunakan macro...
Ok langsung saja pada pembahasan...
secara sederhana dengan menggunakan MASM32 kompiler kita bisa dengan mudah membuat messagebox hanya dengan satu baris perintah saja yaitu dengan menggunakan :
namun untuk membuat shellcode kita sebaiknya tidak menggunakan macro, secara sederhana messgebox dapat di panggil seperti code yang saya gunakan di sini...
http://www.exploit-db.com/exploits/19323/
code #MOV EAX,100DC636 #MOV ECX,0FFFFFFF #MOV EDX,0FFFFFFF #SUB EAX,ECX #SUB EDX,ECX di atas digunakan agar eax berisi offset dari string "PWNED by Ayrbyte...! ^_^" dan edx berisi nilai NULL atau 0x00000000
di atas saya memanggil MessageBox dengan cara Call 77D8050B yaitu alamat dari fungsi MessageBoxA di user32 namun hal ini tidak bisa dilakukan di sistem operasi mulai dari vista ke atas, karna sistem operasi tersebut telah terproteksi oleh ASLR yaitu metode sistem operasi yang merandom alamat2 offset sehingga kita tidak tahu alamat offset yang akan kita gunakan..., karna di tutorial ini saya menggunakan windows 7 maka saya tidak bisa menggunakan cara di atas
untuk itu kita harus membuat fungsi untuk menemukan base address dari suatu modul... setelah beberapa saat browsing mencari fungsi tersebut akhirnya saya menemukannya di http://skypher.com/wiki/index.php/Hacking/Shellcode/kernel32http://skypher.com/wiki/index.php/Hacking/Shellcode/kernel32 dengan cara itu kita bisa menemukan base address dari kernel32... ok langsung saja tulis kode seperti berikut...
setelah itu compile dengan MASM32 compiler dan jalankan di debugger...
Seperti yang terlihat di atas EBP telah terisi base address dari kernel32..., Eitz... lalu apalagi yang kita lakukan...? bukannya MessageBoxA tu adanya di user32...?
Yupz benar sekali... mudah saja cara yang kita lakukan tinggal menghittung selisih antara base address antara kernel32 dengan base address user32 kemudian selisihnya di tambahkan ke ebp sehingga ebp berisi base address user32... ^_^
kernel32.dll :
user32.dll :
Selisihnya adalah 3342336... dengan cara yang sama kita juga harus menemukan selisih dari fungsi messagebox dengan base address user32... jadi kita menambahkan codenya seperti ini
ADD EBP,3342336
;EBP = ditambah 3342336 sekarang menjadi
;base address user32 tempat fungsi MessageBoxA
ADD EBP,387697
;EBP = ditambah 387697 sekarang mengarah
;ke fungsi MessageBoxA
dan dengan menggunakan perintah Call EBP otomatis kita telah memanngil fungsi CallMessageBoxA
namun untuk melakukan itu paling tidak di dalam program kita harus ada fungsi untuk meload module user32.dll...
MessageBox pertama menggunkan Macro dan MessageBox ke dua langsung memanggil fungsi MessageBoxA di user32 ^_^
tp program di atas tidak jalan ketika windows 7 nya direstart butuh sedikit modifikasi lagi agar bisa jalan kembali...
untuk itu kita perlu memodifikasi sedikit program kita lagi...
di windows 7 yang saya pakek user32.dll berada pada urutan ke 8... di bawah modul2 berikut...
ntdll.dll
KERNELBASE.dll
kernel32.dll
msvcrt.dll
USP10.dll
LPK.dll
GDI32.dll
user32.dll
denga itu kita hanya perlu melakukan perulangan sebanyak 8x agar menemukan module user32.dll..., kemudian langkah selanjutnya masih sama seperti yang tadi... ^_^
kode di atas meload user32.dll karena kita masih menggunakan macro invoke MessageBox, NULL, addr MyText1, addr MyTitle, MB_OK yang otomotis membuat user32.dll ikut terload dalam executable module... untuk me load user32.dll
push string user32dll kemudian call LoadLibraryA, dengan begitu user32 akan otomatis ter load ke excutable module...
langkah terakhir yaitu buat semua kode anda agar tidak mengandung karakter NULL (0x00) karna pada dasarnya Shellcode adalah string yang di eksekusi dalam stack jadi apabila ada karakter null dalam program kita akan memutus string dan pada akhirnya membuat program kita rusak... caranya seperti ini...
misal ada perintah mov edx,8 koman tersebut jika di terjemah kan dalam bentuk binary menjadi seperti ini...
BA 08 00 00 00
terdapat 3 karakter null... untuk itu kita dapat merubahnya seperti ini...
mov eax,11111111h
mov ecx,11111119h
sub ecx,eax
mov edx,ecx
hasilnya sama saja...
berikut final code nya :
setelah di kompile... masukkan dalam immunity debugger kemudian blog kode kita tadi lalu klik kanan-->Binary-->Copy Binary
hasilnya seperti ini...
33 F6 33 C9 64 8B 71 30 8B 76 0C 8B 76 1C 33 DB 43 8B 6E 08 8B 7E 20 8B 36 B8 11 11 11 11 B9 14
11 11 11 2B C8 8B D1 3B DA 75 E5 B8 11 11 11 11 B9 11 21 11 11 2B C8 03 E9 B8 11 11 11 11 B9 75
29 16 11 2B C8 8B C1 03 E8 8B D4 83 C2 20 B9 75 73 65 72 89 0A B8 11 11 11 11 B9 44 43 11 11 2B
C8 89 4A 04 52 FF D5 83 C4 04 33 F6 33 C9 64 8B 71 30 8B 76 0C 8B 76 1C 33 DB 43 8B 6E 08 8B 7E
20 8B 36 B8 11 11 11 11 B9 19 11 11 11 2B C8 8B D1 3B DA 75 E5 B8 11 11 11 11 B9 11 21 11 11 2B
C8 03 E9 B8 11 11 11 11 B9 82 EB 16 11 2B C8 8B C1 03 E8 B8 11 11 11 11 B9 95 12 11 11 2B C8 2B
E1 8B D4 B9 4D 65 73 73 89 0A B9 61 67 65 42 89 4A 04 B9 6F 78 41 20 89 4A 08 B9 42 79 20 41 89
4A 0C B9 79 72 62 79 89 4A 10 B8 11 11 11 11 B9 85 76 11 11 2B C8 89 4A 14 8B DA 83 C3 14 B9 4D
65 73 73 89 4B 04 B9 61 67 65 42 89 4B 08 B9 6F 78 41 20 89 4B 0C B9 27 74 68 65 89 4B 10 B9 20
68 61 72 89 4B 14 B9 64 20 77 61 89 4B 18 B9 79 27 20 42 89 4B 1C B9 79 20 41 79 89 4B 20 B9 72
62 79 74 89 4B 24 B8 11 11 11 11 B9 76 11 11 11 2B C8 89 4B 28 83 C3 04 33 C0 50 52 53 50 FF D5
33 F6 33 C9 64 8B 71 30 8B 76 0C 8B 76 1C 33 DB 43 8B 6E 08 8B 7E 20 8B 36 B8 11 11 11 11 B9 13
11 11 11 2B C8 8B D1 3B DA 75 E5 B8 11 11 11 11 B9 37 26 14 11 2B C8 03 E9 FF D5
kemudian rubah dalam bentuk string yang bisa dibaca c++
"\x33\xF6\x33\xC9\x64\x8B\x71\x30\x8B\x76\x0C\x8B\x76\x1C\x33\xDB\x43\x8B\x6E"
"\x08\x8B\x7E\x20\x8B\x36\xB8\x11\x11\x11\x11\xB9\x14\x11\x11\x11\x2B\xC8\x8B"
"\xD1\x3B\xDA\x75\xE5\xB8\x11\x11\x11\x11\xB9\x11\x21\x11\x11\x2B\xC8\x03\xE9"
"\xB8\x11\x11\x11\x11\xB9\x75\x29\x16\x11\x2B\xC8\x8B\xC1\x03\xE8\x8B\xD4\x83"
"\xC2\x20\xB9\x75\x73\x65\x72\x89\x0A\xB8\x11\x11\x11\x11\xB9\x44\x43\x11\x11"
"\x2B\xC8\x89\x4A\x04\x52\xFF\xD5\x83\xC4\x04\x33\xF6\x33\xC9\x64\x8B\x71\x30"
"\x8B\x76\x0C\x8B\x76\x1C\x33\xDB\x43\x8B\x6E\x08\x8B\x7E\x20\x8B\x36\xB8\x11"
"\x11\x11\x11\xB9\x19\x11\x11\x11\x2B\xC8\x8B\xD1\x3B\xDA\x75\xE5\xB8\x11\x11"
"\x11\x11\xB9\x11\x21\x11\x11\x2B\xC8\x03\xE9\xB8\x11\x11\x11\x11\xB9\x82\xEB"
"\x16\x11\x2B\xC8\x8B\xC1\x03\xE8\xB8\x11\x11\x11\x11\xB9\x95\x12\x11\x11\x2B"
"\xC8\x2B\xE1\x8B\xD4\xB9\x4D\x65\x73\x73\x89\x0A\xB9\x61\x67\x65\x42\x89\x4A"
"\x04\xB9\x6F\x78\x41\x20\x89\x4A\x08\xB9\x42\x79\x20\x41\x89\x4A\x0C\xB9\x79"
"\x72\x62\x79\x89\x4A\x10\xB8\x11\x11\x11\x11\xB9\x85\x76\x11\x11\x2B\xC8\x89"
"\x4A\x14\x8B\xDA\x83\xC3\x14\xB9\x4D\x65\x73\x73\x89\x4B\x04\xB9\x61\x67\x65"
"\x42\x89\x4B\x08\xB9\x6F\x78\x41\x20\x89\x4B\x0C\xB9\x27\x74\x68\x65\x89\x4B"
"\x10\xB9\x20\x68\x61\x72\x89\x4B\x14\xB9\x64\x20\x77\x61\x89\x4B\x18\xB9\x79"
"\x27\x20\x42\x89\x4B\x1C\xB9\x79\x20\x41\x79\x89\x4B\x20\xB9\x72\x62\x79\x74"
"\x89\x4B\x24\xB8\x11\x11\x11\x11\xB9\x76\x11\x11\x11\x2B\xC8\x89\x4B\x28\x83"
"\xC3\x04\x33\xC0\x50\x52\x53\x50\xFF\xD5\x33\xF6\x33\xC9\x64\x8B\x71\x30\x8B"
"\x76\x0C\x8B\x76\x1C\x33\xDB\x43\x8B\x6E\x08\x8B\x7E\x20\x8B\x36\xB8\x11\x11"
"\x11\x11\xB9\x13\x11\x11\x11\x2B\xC8\x8B\xD1\x3B\xDA\x75\xE5\xB8\x11\x11\x11"
"\x11\xB9\x37\x26\x14\x11\x2B\xC8\x03\xE9\xFF\xD5";
shell code kita siap di test...
dan tara... kita telah berhasil membuat suatu shell code...
Sumber :
tulisan ini hanya untuk para pemula seperti saya yang ingin belajar... ^_^
pertama2 kita buat dulu messagebox dalam bahasa assembly, tetentunya buat tanpa menggunakan macro...
Ok langsung saja pada pembahasan...
secara sederhana dengan menggunakan MASM32 kompiler kita bisa dengan mudah membuat messagebox hanya dengan satu baris perintah saja yaitu dengan menggunakan :
- Code: Select all
invoke MessageBox, NULL, addr MyText1, addr MyTitle, MB_OK
namun untuk membuat shellcode kita sebaiknya tidak menggunakan macro, secara sederhana messgebox dapat di panggil seperti code yang saya gunakan di sini...
http://www.exploit-db.com/exploits/19323/
- Code: Select all
000DC610 B8 36C60D10 MOV EAX,100DC636 000DC615 B9 FFFFFF0F MOV ECX,0FFFFFFF 000DC61A BA FFFFFF0F MOV EDX,0FFFFFFF 000DC61F 2BC1 SUB EAX,ECX 000DC621 2BD1 SUB EDX,ECX 000DC623 52 PUSH EDX 000DC624 50 PUSH EAX 000DC625 90 NOP 000DC626 90 NOP 000DC627 90 NOP 000DC628 90 NOP 000DC629 90 NOP 000DC62A 50 PUSH EAX 000DC62B 90 NOP 000DC62C 90 NOP 000DC62D 90 NOP 000DC62E 90 NOP 000DC62F 52 PUSH EDX 000DC630 90 NOP 000DC631 E8 D53ECA77 CALL USER32.MessageBoxA
- Code: Select all
push 0 push judul_messagebox push isi_messagebox push 0 call MessageBoxA
code #MOV EAX,100DC636 #MOV ECX,0FFFFFFF #MOV EDX,0FFFFFFF #SUB EAX,ECX #SUB EDX,ECX di atas digunakan agar eax berisi offset dari string "PWNED by Ayrbyte...! ^_^" dan edx berisi nilai NULL atau 0x00000000
di atas saya memanggil MessageBox dengan cara Call 77D8050B yaitu alamat dari fungsi MessageBoxA di user32 namun hal ini tidak bisa dilakukan di sistem operasi mulai dari vista ke atas, karna sistem operasi tersebut telah terproteksi oleh ASLR yaitu metode sistem operasi yang merandom alamat2 offset sehingga kita tidak tahu alamat offset yang akan kita gunakan..., karna di tutorial ini saya menggunakan windows 7 maka saya tidak bisa menggunakan cara di atas
untuk itu kita harus membuat fungsi untuk menemukan base address dari suatu modul... setelah beberapa saat browsing mencari fungsi tersebut akhirnya saya menemukannya di http://skypher.com/wiki/index.php/Hacking/Shellcode/kernel32http://skypher.com/wiki/index.php/Hacking/Shellcode/kernel32 dengan cara itu kita bisa menemukan base address dari kernel32... ok langsung saja tulis kode seperti berikut...
- Code: Select all
include \masm32\include\masm32rt.inc .data .code start: ASSUME FS:NOTHING XOR ESI,ESI XOR ECX,ECX ; ECX = 0 MOV ESI,FS:[ECX + 30h] ; ESI = &(PEB) ([FS:0x30]) MOV ESI,[ESI + 0Ch] ; ESI = PEB->Ldr MOV ESI,[ESI + 1Ch] ; ESI = PEB->Ldr.InInitOrder next_module: MOV EBP,[ESI + 08h] ; EBP = InInitOrder[X].base_address MOV EDI,[ESI + 20h] ; EBP = InInitOrder[X].module_name (unicode) MOV ESI,[ESI] ; ESI = InInitOrder[X].flink (next module) CMP [EDI + 12*2], CL ; modulename[12] == 0 ? JNE next_module ; No: mencoba module berikutnya. ; EBP berisi base address kernel32 call ExitProcess end start
setelah itu compile dengan MASM32 compiler dan jalankan di debugger...
Seperti yang terlihat di atas EBP telah terisi base address dari kernel32..., Eitz... lalu apalagi yang kita lakukan...? bukannya MessageBoxA tu adanya di user32...?
Yupz benar sekali... mudah saja cara yang kita lakukan tinggal menghittung selisih antara base address antara kernel32 dengan base address user32 kemudian selisihnya di tambahkan ke ebp sehingga ebp berisi base address user32... ^_^
kernel32.dll :
user32.dll :
Selisihnya adalah 3342336... dengan cara yang sama kita juga harus menemukan selisih dari fungsi messagebox dengan base address user32... jadi kita menambahkan codenya seperti ini
ADD EBP,3342336
;EBP = ditambah 3342336 sekarang menjadi
;base address user32 tempat fungsi MessageBoxA
ADD EBP,387697
;EBP = ditambah 387697 sekarang mengarah
;ke fungsi MessageBoxA
dan dengan menggunakan perintah Call EBP otomatis kita telah memanngil fungsi CallMessageBoxA
namun untuk melakukan itu paling tidak di dalam program kita harus ada fungsi untuk meload module user32.dll...
- Code: Select all
include \masm32\include\masm32rt.inc .data MyTitle db "Testing MessageBoxA by Ayrbyte",0 MyText1 db "Test Messagebox Dengan Macro by Ayrbyte",0 MyText2 db "Test Calling MessageboxA Tanpa Macro by Ayrbyte",0 .code start: ;----------------------------------------->MessageBox Menggunakan Macro<------------------------------------------------- invoke MessageBox, NULL, addr MyText1, addr MyTitle, MB_OK jmp tanpa_macro ;------------------------------------------->MessageBox Tanpa Macro<----------------------------------------------------- tanpa_macro: ASSUME FS:NOTHING XOR ESI,ESI XOR ECX,ECX ; ECX = 0 MOV ESI,FS:[ECX + 30h] ; ESI = &(PEB) ([FS:0x30]) MOV ESI,[ESI + 0Ch] ; ESI = PEB->Ldr MOV ESI,[ESI + 1Ch] ; ESI = PEB->Ldr.InInitOrder next_module: MOV EBP,[ESI + 08h] ; EBP = InInitOrder[X].base_address MOV EDI,[ESI + 20h] ; EBP = InInitOrder[X].module_name (unicode) MOV ESI,[ESI] ; ESI = InInitOrder[X].flink (next module) CMP [EDI + 12*2], CL ; modulename[12] == 0 ? JNE next_module ; No: mencoba module berikutnya. ;EBP berisi base address kernel32 ADD EBP,3342336 ;EBP = ditambah 3342336 sekarang menjadi ;base address user32 tempat fungsi MessageBoxA ADD EBP,387697 ;EBP = ditambah 387697 sekarang mengarah ;ke fungsi MessageBoxA push 0 push offset MyTitle push offset MyText2 push 0 call EBP ;CALL MessageBoxA call ExitProcess end start
MessageBox pertama menggunkan Macro dan MessageBox ke dua langsung memanggil fungsi MessageBoxA di user32 ^_^
tp program di atas tidak jalan ketika windows 7 nya direstart butuh sedikit modifikasi lagi agar bisa jalan kembali...
untuk itu kita perlu memodifikasi sedikit program kita lagi...
di windows 7 yang saya pakek user32.dll berada pada urutan ke 8... di bawah modul2 berikut...
ntdll.dll
KERNELBASE.dll
kernel32.dll
msvcrt.dll
USP10.dll
LPK.dll
GDI32.dll
user32.dll
denga itu kita hanya perlu melakukan perulangan sebanyak 8x agar menemukan module user32.dll..., kemudian langkah selanjutnya masih sama seperti yang tadi... ^_^
- Code: Select all
;Calling MessageBoxA tanpa macro "the hard way" ;by Ayrbyte ;using masm32 Compiler include \masm32\include\masm32rt.inc .data MyTitle db "Testing MessageBoxA by Ayrbyte",0 MyText1 db "Test Messagebox Dengan Macro by Ayrbyte",0 MyText2 db "Test Calling MessageboxA Tanpa Macro by Ayrbyte",0 .code start: ;--->MessageBox Menggunakan Macro<--- invoke MessageBox, NULL, addr MyText1, addr MyTitle, MB_OK jmp tanpa_macro ;--->MessageBox Tanpa Macro<--- tanpa_macro: ASSUME FS:NOTHING XOR ESI,ESI XOR ECX,ECX ; ECX = 0 MOV ESI,FS:[ECX + 30h] ; ESI = &(PEB) ([FS:0x30]) MOV ESI,[ESI + 0Ch] ; ESI = PEB->Ldr MOV ESI,[ESI + 1Ch] ; ESI = PEB->Ldr.InInitOrder xor ebx,ebx next_module: inc ebx MOV EBP,[ESI + 08h] ; EBP = InInitOrder[X].base_address MOV EDI,[ESI + 20h] ; EBP = InInitOrder[X].module_name (unicode) MOV ESI,[ESI] ; ESI = InInitOrder[X].flink (next module) mov edx,8 ; user32.dll berada di urutan ke 8 CMP ebx,edx; JNE next_module ; No: mencoba module berikutnya. ; EBP berisi base address user32 add ebp,1000h ; offset awal user32.dll mov eax,5DA71h add ebp,eax ; EBP ditambah 5DA71 agar menjadi offset MessageBoxA xor edx,edx ; EDX = NULL / 0 push EDX push offset MyTitle push offset MyText2 push EDX call ebp ;calling MessageBoxA ret 0 end start
kode di atas meload user32.dll karena kita masih menggunakan macro invoke MessageBox, NULL, addr MyText1, addr MyTitle, MB_OK yang otomotis membuat user32.dll ikut terload dalam executable module... untuk me load user32.dll
push string user32dll kemudian call LoadLibraryA, dengan begitu user32 akan otomatis ter load ke excutable module...
langkah terakhir yaitu buat semua kode anda agar tidak mengandung karakter NULL (0x00) karna pada dasarnya Shellcode adalah string yang di eksekusi dalam stack jadi apabila ada karakter null dalam program kita akan memutus string dan pada akhirnya membuat program kita rusak... caranya seperti ini...
misal ada perintah mov edx,8 koman tersebut jika di terjemah kan dalam bentuk binary menjadi seperti ini...
BA 08 00 00 00
terdapat 3 karakter null... untuk itu kita dapat merubahnya seperti ini...
mov eax,11111111h
mov ecx,11111119h
sub ecx,eax
mov edx,ecx
hasilnya sama saja...
berikut final code nya :
- Code: Select all
;Calling MessageBoxA the "Hard Way" ;by Ayrbyte ;using masm32 Compiler include \masm32\include\masm32rt.inc .code start: ;--->Menemukan Address LoadLibraryA<--- ASSUME FS:NOTHING XOR ESI,ESI XOR ECX,ECX ; ECX = 0 MOV ESI,FS:[ECX + 30h] ; ESI = &(PEB) ([FS:0x30]) MOV ESI,[ESI + 0Ch] ; ESI = PEB->Ldr MOV ESI,[ESI + 1Ch] ; ESI = PEB->Ldr.InInitOrder xor ebx,ebx next_module1: inc ebx MOV EBP,[ESI + 08h] ; EBP = InInitOrder[X].base_address MOV EDI,[ESI + 20h] ; EBP = InInitOrder[X].module_name (unicode) MOV ESI,[ESI] ; ESI = InInitOrder[X].flink (next module) mov eax,11111111h mov ecx,11111114h sub ecx,eax mov edx,ecx ; ecx = 3 kernel32 berada di urutan ke 3 CMP ebx,edx JNE next_module1 ; No: mencoba module berikutnya. ; EBP berisi base address kernel32 mov eax,11111111h mov ecx,11112111h sub ecx,eax add ebp,ecx ; offset awal kernel32.dll mov eax,11111111h mov ecx,11162975h sub ecx,eax mov eax,ecx add ebp,eax ; EBP ditambah 51864 agar menjadi offset LoadLibrary A ;--->Meload user32 library<--- ;memasukkan 'user32' string ke stack mov edx,esp add edx,32 mov ecx,72657375h ;75657375h = 'user' dalam format little endian mov ds:[edx],ecx ;memasukkan 'user' ke stack mov eax,11111111h mov ecx,11114344h sub ecx,eax ;membuat ecx terisi oleh 3233h = '32' dalam format little endian mov ds:[edx+4],ecx ;memasukkan '32' ke stack ;sekarang edx menjadi offset string 'user32' push edx ;push 'user32' call ebp ;Calling kernel32dll.LoadLibraryA add esp,4 ;--->Menemukan Address MessageBoxA<--- ASSUME FS:NOTHING XOR ESI,ESI XOR ECX,ECX ; ECX = 0 MOV ESI,FS:[ECX + 30h] ; ESI = &(PEB) ([FS:0x30]) MOV ESI,[ESI + 0Ch] ; ESI = PEB->Ldr MOV ESI,[ESI + 1Ch] ; ESI = PEB->Ldr.InInitOrder xor ebx,ebx next_module2: inc ebx MOV EBP,[ESI + 08h] ; EBP = InInitOrder[X].base_address MOV EDI,[ESI + 20h] ; EBP = InInitOrder[X].module_name (unicode) MOV ESI,[ESI] ; ESI = InInitOrder[X].flink (next module) mov eax,11111111h mov ecx,11111119h sub ecx,eax mov edx,ecx ; ecx = 8 user32 berada di urutan ke 8 CMP ebx,edx; JNE next_module2 ; No: mencoba module berikutnya. ; EBP berisi base address user32 mov eax,11111111h mov ecx,11112111h sub ecx,eax add ebp,ecx ; offset awal user32.dll mov eax,11111111h mov ecx,1116EB82h sub ecx,eax mov eax,ecx add ebp,eax ; EBP ditambah 5DA71 agar menjadi offset MessageBoxA ;--->Mempersiapkan String Untuk Judul Dan Isi Messagebox<--- mov eax,11111111h mov ecx,11111295h sub ecx,eax sub esp,ecx ;offset edx judul 'MessageBoxA By Ayrbyte' mov edx,esp mov ecx,7373654Dh ;'Mess' mov ds:[edx],ecx mov ecx,42656761h ;'ageB' mov ds:[edx+4],ecx mov ecx,2041786Fh ;'oxA ' mov ds:[edx+8],ecx mov ecx,41207942h ;'By A' mov ds:[edx+12],ecx mov ecx,79627279h ;'yrby' mov ds:[edx+16],ecx mov eax,11111111h mov ecx,11117685h sub ecx,eax ;'te' mov ds:[edx+20],ecx ;offset ebx+23 isi 'MessageBoxA 'the hard way' By Ayrbyte' mov ebx,edx add ebx,20 mov ecx,7373654dh ;'Mess' mov ds:[ebx+4],ecx mov ecx,42656761h ;'ageB' mov ds:[ebx+8],ecx mov ecx,2041786Fh ;'oxA ' mov ds:[ebx+12],ecx mov ecx,65687427h ;''the' mov ds:[ebx+16],ecx mov ecx,72616820h ;' har' mov ds:[ebx+20],ecx mov ecx,61772064h ;'d wa' mov ds:[ebx+24],ecx mov ecx,42202779h ;'y' B' mov ds:[ebx+28],ecx mov ecx,79412079h ;'y Ay' mov ds:[ebx+32],ecx mov ecx,74796272h ;'rbyt' mov ds:[ebx+36],ecx mov eax,11111111h mov ecx,11111176h sub ecx,eax ;'e' mov ds:[ebx+40],ecx add ebx,4 ;--->Calling MessageBoxA<--- xor eax,eax ; eax = NULL / 0 push eax push edx push ebx push eax call ebp ;calling user32.MessageBoxA ;--->Calling ExitProcess<--- ASSUME FS:NOTHING XOR ESI,ESI XOR ECX,ECX ; ECX = 0 MOV ESI,FS:[ECX + 30h] ; ESI = &(PEB) ([FS:0x30]) MOV ESI,[ESI + 0Ch] ; ESI = PEB->Ldr MOV ESI,[ESI + 1Ch] ; ESI = PEB->Ldr.InInitOrder xor ebx,ebx next_module3: inc ebx MOV EBP,[ESI + 08h] ; EBP = InInitOrder[X].base_address MOV EDI,[ESI + 20h] ; EBP = InInitOrder[X].module_name (unicode) MOV ESI,[ESI] ; ESI = InInitOrder[X].flink (next module) mov eax,11111111h mov ecx,11111113h sub ecx,eax mov edx,ecx ; ecx = 2 kernelbase berada di urutan ke 2 CMP ebx,edx; JNE next_module3 ; No: mencoba module berikutnya. ; EBP berisi base address kernelbase mov eax,11111111h mov ecx,11142637h sub ecx,eax add ebp,ecx call ebp ; Calling KERNELBASEDLL.ExitProcess end start
setelah di kompile... masukkan dalam immunity debugger kemudian blog kode kita tadi lalu klik kanan-->Binary-->Copy Binary
hasilnya seperti ini...
33 F6 33 C9 64 8B 71 30 8B 76 0C 8B 76 1C 33 DB 43 8B 6E 08 8B 7E 20 8B 36 B8 11 11 11 11 B9 14
11 11 11 2B C8 8B D1 3B DA 75 E5 B8 11 11 11 11 B9 11 21 11 11 2B C8 03 E9 B8 11 11 11 11 B9 75
29 16 11 2B C8 8B C1 03 E8 8B D4 83 C2 20 B9 75 73 65 72 89 0A B8 11 11 11 11 B9 44 43 11 11 2B
C8 89 4A 04 52 FF D5 83 C4 04 33 F6 33 C9 64 8B 71 30 8B 76 0C 8B 76 1C 33 DB 43 8B 6E 08 8B 7E
20 8B 36 B8 11 11 11 11 B9 19 11 11 11 2B C8 8B D1 3B DA 75 E5 B8 11 11 11 11 B9 11 21 11 11 2B
C8 03 E9 B8 11 11 11 11 B9 82 EB 16 11 2B C8 8B C1 03 E8 B8 11 11 11 11 B9 95 12 11 11 2B C8 2B
E1 8B D4 B9 4D 65 73 73 89 0A B9 61 67 65 42 89 4A 04 B9 6F 78 41 20 89 4A 08 B9 42 79 20 41 89
4A 0C B9 79 72 62 79 89 4A 10 B8 11 11 11 11 B9 85 76 11 11 2B C8 89 4A 14 8B DA 83 C3 14 B9 4D
65 73 73 89 4B 04 B9 61 67 65 42 89 4B 08 B9 6F 78 41 20 89 4B 0C B9 27 74 68 65 89 4B 10 B9 20
68 61 72 89 4B 14 B9 64 20 77 61 89 4B 18 B9 79 27 20 42 89 4B 1C B9 79 20 41 79 89 4B 20 B9 72
62 79 74 89 4B 24 B8 11 11 11 11 B9 76 11 11 11 2B C8 89 4B 28 83 C3 04 33 C0 50 52 53 50 FF D5
33 F6 33 C9 64 8B 71 30 8B 76 0C 8B 76 1C 33 DB 43 8B 6E 08 8B 7E 20 8B 36 B8 11 11 11 11 B9 13
11 11 11 2B C8 8B D1 3B DA 75 E5 B8 11 11 11 11 B9 37 26 14 11 2B C8 03 E9 FF D5
kemudian rubah dalam bentuk string yang bisa dibaca c++
"\x33\xF6\x33\xC9\x64\x8B\x71\x30\x8B\x76\x0C\x8B\x76\x1C\x33\xDB\x43\x8B\x6E"
"\x08\x8B\x7E\x20\x8B\x36\xB8\x11\x11\x11\x11\xB9\x14\x11\x11\x11\x2B\xC8\x8B"
"\xD1\x3B\xDA\x75\xE5\xB8\x11\x11\x11\x11\xB9\x11\x21\x11\x11\x2B\xC8\x03\xE9"
"\xB8\x11\x11\x11\x11\xB9\x75\x29\x16\x11\x2B\xC8\x8B\xC1\x03\xE8\x8B\xD4\x83"
"\xC2\x20\xB9\x75\x73\x65\x72\x89\x0A\xB8\x11\x11\x11\x11\xB9\x44\x43\x11\x11"
"\x2B\xC8\x89\x4A\x04\x52\xFF\xD5\x83\xC4\x04\x33\xF6\x33\xC9\x64\x8B\x71\x30"
"\x8B\x76\x0C\x8B\x76\x1C\x33\xDB\x43\x8B\x6E\x08\x8B\x7E\x20\x8B\x36\xB8\x11"
"\x11\x11\x11\xB9\x19\x11\x11\x11\x2B\xC8\x8B\xD1\x3B\xDA\x75\xE5\xB8\x11\x11"
"\x11\x11\xB9\x11\x21\x11\x11\x2B\xC8\x03\xE9\xB8\x11\x11\x11\x11\xB9\x82\xEB"
"\x16\x11\x2B\xC8\x8B\xC1\x03\xE8\xB8\x11\x11\x11\x11\xB9\x95\x12\x11\x11\x2B"
"\xC8\x2B\xE1\x8B\xD4\xB9\x4D\x65\x73\x73\x89\x0A\xB9\x61\x67\x65\x42\x89\x4A"
"\x04\xB9\x6F\x78\x41\x20\x89\x4A\x08\xB9\x42\x79\x20\x41\x89\x4A\x0C\xB9\x79"
"\x72\x62\x79\x89\x4A\x10\xB8\x11\x11\x11\x11\xB9\x85\x76\x11\x11\x2B\xC8\x89"
"\x4A\x14\x8B\xDA\x83\xC3\x14\xB9\x4D\x65\x73\x73\x89\x4B\x04\xB9\x61\x67\x65"
"\x42\x89\x4B\x08\xB9\x6F\x78\x41\x20\x89\x4B\x0C\xB9\x27\x74\x68\x65\x89\x4B"
"\x10\xB9\x20\x68\x61\x72\x89\x4B\x14\xB9\x64\x20\x77\x61\x89\x4B\x18\xB9\x79"
"\x27\x20\x42\x89\x4B\x1C\xB9\x79\x20\x41\x79\x89\x4B\x20\xB9\x72\x62\x79\x74"
"\x89\x4B\x24\xB8\x11\x11\x11\x11\xB9\x76\x11\x11\x11\x2B\xC8\x89\x4B\x28\x83"
"\xC3\x04\x33\xC0\x50\x52\x53\x50\xFF\xD5\x33\xF6\x33\xC9\x64\x8B\x71\x30\x8B"
"\x76\x0C\x8B\x76\x1C\x33\xDB\x43\x8B\x6E\x08\x8B\x7E\x20\x8B\x36\xB8\x11\x11"
"\x11\x11\xB9\x13\x11\x11\x11\x2B\xC8\x8B\xD1\x3B\xDA\x75\xE5\xB8\x11\x11\x11"
"\x11\xB9\x37\x26\x14\x11\x2B\xC8\x03\xE9\xFF\xD5";
shell code kita siap di test...
- Code: Select all
#include <iostream> using namespace std; char code[] = "\x33\xF6\x33\xC9\x64\x8B\x71\x30\x8B\x76\x0C\x8B\x76\x1C\x33\xDB\x43\x8B\x6E" "\x08\x8B\x7E\x20\x8B\x36\xB8\x11\x11\x11\x11\xB9\x14\x11\x11\x11\x2B\xC8\x8B" "\xD1\x3B\xDA\x75\xE5\xB8\x11\x11\x11\x11\xB9\x11\x21\x11\x11\x2B\xC8\x03\xE9" "\xB8\x11\x11\x11\x11\xB9\x75\x29\x16\x11\x2B\xC8\x8B\xC1\x03\xE8\x8B\xD4\x83" "\xC2\x20\xB9\x75\x73\x65\x72\x89\x0A\xB8\x11\x11\x11\x11\xB9\x44\x43\x11\x11" "\x2B\xC8\x89\x4A\x04\x52\xFF\xD5\x83\xC4\x04\x33\xF6\x33\xC9\x64\x8B\x71\x30" "\x8B\x76\x0C\x8B\x76\x1C\x33\xDB\x43\x8B\x6E\x08\x8B\x7E\x20\x8B\x36\xB8\x11" "\x11\x11\x11\xB9\x19\x11\x11\x11\x2B\xC8\x8B\xD1\x3B\xDA\x75\xE5\xB8\x11\x11" "\x11\x11\xB9\x11\x21\x11\x11\x2B\xC8\x03\xE9\xB8\x11\x11\x11\x11\xB9\x82\xEB" "\x16\x11\x2B\xC8\x8B\xC1\x03\xE8\xB8\x11\x11\x11\x11\xB9\x95\x12\x11\x11\x2B" "\xC8\x2B\xE1\x8B\xD4\xB9\x4D\x65\x73\x73\x89\x0A\xB9\x61\x67\x65\x42\x89\x4A" "\x04\xB9\x6F\x78\x41\x20\x89\x4A\x08\xB9\x42\x79\x20\x41\x89\x4A\x0C\xB9\x79" "\x72\x62\x79\x89\x4A\x10\xB8\x11\x11\x11\x11\xB9\x85\x76\x11\x11\x2B\xC8\x89" "\x4A\x14\x8B\xDA\x83\xC3\x14\xB9\x4D\x65\x73\x73\x89\x4B\x04\xB9\x61\x67\x65" "\x42\x89\x4B\x08\xB9\x6F\x78\x41\x20\x89\x4B\x0C\xB9\x27\x74\x68\x65\x89\x4B" "\x10\xB9\x20\x68\x61\x72\x89\x4B\x14\xB9\x64\x20\x77\x61\x89\x4B\x18\xB9\x79" "\x27\x20\x42\x89\x4B\x1C\xB9\x79\x20\x41\x79\x89\x4B\x20\xB9\x72\x62\x79\x74" "\x89\x4B\x24\xB8\x11\x11\x11\x11\xB9\x76\x11\x11\x11\x2B\xC8\x89\x4B\x28\x83" "\xC3\x04\x33\xC0\x50\x52\x53\x50\xFF\xD5\x33\xF6\x33\xC9\x64\x8B\x71\x30\x8B" "\x76\x0C\x8B\x76\x1C\x33\xDB\x43\x8B\x6E\x08\x8B\x7E\x20\x8B\x36\xB8\x11\x11" "\x11\x11\xB9\x13\x11\x11\x11\x2B\xC8\x8B\xD1\x3B\xDA\x75\xE5\xB8\x11\x11\x11" "\x11\xB9\x37\x26\x14\x11\x2B\xC8\x03\xE9\xFF\xD5"; int main(){((void (*)(void))code)();}
dan tara... kita telah berhasil membuat suatu shell code...
Sumber :
Tidak ada komentar:
Posting Komentar