Thursday, June 28, 2012

Membuat MessageBox tanpa macro 'the hard way' part 1

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... ^_^

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:

laurence said...
This comment has been removed by the author.

Post a Comment