tulisan ini hanya untuk para pemula seperti saya yang ingin belajar... ^_^
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 :
invoke MessageBox, NULL, addr MyText1, addr MyTitle, MB_OK
kali ini kita akan mencoba 'the hard way' untuk membuat suatu message box
sebenarnya gak begitu sulit2 amat sih... cumak yang penting kan udah gak terdiri dari satu baris doang hehehe... ^_^
mungkin ada yang protes... lho...lho...lho... kalok ada cara yang mudah lalu mengapa kita menggunakan cara yang sulit...?
jawabannya mudah... dengan memahami cara ini... diharapkan kita nantinya juga bisa membuat suatu shellcode messagebox dengan mudah
ok langsung saja... secara sederhana messgebox dapat di panggil seperti code yang saya gunakan di sini... http://1337day.com/exploits/18759
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
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...
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...
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 maaf..., program di atas tidak jalan ketika windows 7 nya direstart butuh sedikit modifikasi lagi agar bisa jalan kembali... jadi bantu mikir dulu ya hehehehe... ^_^
1 comment:
Post a Comment