|
[ opcode @ 18.07.2006. 14:20 ] @
| Code:
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
asm{ mov edi,0012E224H
mov byte ptr[edi+01H],6FH //o
mov byte ptr[edi+02H],70H //p
mov byte ptr[edi+03H],65H //e
mov byte ptr[edi+04H],6EH //n
xor ah,ah
mov byte ptr[edi+05H],ah //00h
mov byte ptr[edi+06H],68H // h
mov byte ptr[edi+07H],74H // t
mov byte ptr[edi+08H],74H // t
mov byte ptr[edi+09H],70H // p
mov byte ptr[edi+0AH],3AH // :
mov byte ptr[edi+0BH],2FH // /
mov byte ptr[edi+0CH],2FH // /
mov byte ptr[edi+0DH],77H // w
mov byte ptr[edi+0EH],77H // w
mov byte ptr[edi+0FH],77H // w
mov byte ptr[edi+10H],2EH // .
mov byte ptr[edi+11H],67H // g
mov byte ptr[edi+12H],6FH // o
mov byte ptr[edi+13H],6FH // o
mov byte ptr[edi+14H],67H // g
mov byte ptr[edi+15H],6CH // l
mov byte ptr[edi+16H],65H // e
mov byte ptr[edi+17H],2EH // .
mov byte ptr[edi+18H],63H // c
mov byte ptr[edi+19H],6FH // o
mov byte ptr[edi+1AH],6DH // m
xor ah,ah
mov byte ptr[edi+1BH],ah // 00h
mov eax,1
push eax
xor eax,eax
push eax
push eax
lea eax,[edi+06h]
push eax
lea eax,[edi+01H]
push eax
xor eax,eax
push eax
mov eax,0x7ca0fe44
call eax
}
system("PAUSE");
return 0;
}
To bi trebalo bit
ShellExecute(0, "open", "http://www.google.com",
NULL, NULL, SW_NORMAL); |
[ tosa @ 18.07.2006. 14:55 ] @
Code: mov eax,0x7ca0fe44
call eax
Odakle ti ova adresa? ;)
Bio bi to zanimljiv feature...
...kada bi znali da Windows ima neke funkcije na fiksiranim adresama.
[ opcode @ 18.07.2006. 15:03 ] @
To je adresa od ShellExecuteA iz shell32.dll -a , dobio sam ju preko GetProcAddress apija...
A ovaj dio
Code:
mov edi,0012E224H => mjesto na stacku gdje ima puno praznog mjesta..
[ tupito @ 18.07.2006. 17:57 ] @
uopste mi nije jasno sto si koristio fiksne adrese, one ti inace nista neznace???
sto jednostavno nisi pozvao funkciju preko imena:
Code: call ShellExecute
[ opcode @ 18.07.2006. 18:21 ] @
Lol.. moram od toga napravit opcode  )
Ne kuzim bre.. ako stavim call ShellExecuteA radi ok.. al moram nekako nac adresu da mogu napravit opcode .. shellcode ako ti sta vise znaci.. odnosno vadjenje hex instrukcija..
[ Mikky @ 18.07.2006. 19:09 ] @
Mislim da ti je greska ovde:
Code:
lea eax,[edi+01H]
push eax
Ovo ce ti gurnuti na stack adresu stringa "pen" a ne "open". Za "open" uradi samo:
Code:
push edi
Jos par stvari:
MS ne garantuje da se ShellExecute kao i svaka druga API funkcija nalaze na fiksnim adresama (mada je to obicno tako), a pogotovo ne na razlitim verzijama Windows-a. U prevodu ovo ce raditi samo na svim XP sistemima ako si na njemu testirao i to samo mozda. Dakle nemoj da se oslanjas na fiksne adrese vec ih nekako dobavi dinamicki.
Zasto umesto ovog:
Code:
xor ah,ah
mov byte ptr[edi+05H],ah //00h
nestavis ovo:
Code:
mov byte ptr[edi+05H],0 //00h
Ili mozda ovako:
Code:
// adresa "http://www.stagod.com" ide na stack pomocu call instrukcije
// (umesto ovog db mozda ide nesto drugo, nisam koristio c++ inline asm)
call L1:
db "http://www.stagod.com",0
L1: // slicno radis i za druge stringove
[ opcode @ 18.07.2006. 19:18 ] @
"Zasto umesto ovog:
Code:
xor ah,ah
mov byte ptr[edi+05H],ah //00h
nestavis ovo:
Code:
mov byte ptr[edi+05H],0 //00h"
Zato jer u shellcodeu ne smije bit 00 bajt, jer se sa 00 bajtom u C/C++ string prekida.. tako da se to mora zaobic..
\xBF\x04\xE0\x12\x00\xC6\x47\x01\x6F\xC6\x47\x02\x70\xC6\x47\x03\x65\xC6\x47\x04\x6E\x32\xE4\x88\x67\x05\xC6\x47\x06\x68\xC6\x47\x07\x74\xC6\x47\x08\x74\xC6\x47\x09\x70\xC6\x47\x0A\x3A\xC6\x47\x0B\x2F\xC6\x47\x0C\x2F\xC6\x47\x0D\x77\xC6\x47\x0E\x77\xC6\x47\x0F\x77\xC6\x47\x10\x2E\xC6\x47\x11\x67\xC6\x47\x12\x6F\xC6\x47\x13\x6F\xC6\x47\x14\x67\xC6\x47\x15\x6C\xC6\x47\x16\x65\xC6\x47\x17\x2E\xC6\x47\x18\x63\xC6\x47\x19\x6F\xC6\x47\x1A\x6D\x32\xE4\x88\x67\x1B\xB8\x01\x00\x00\x50\x31\xC0\x50\x50\x8D\x47\x06\x50\x8D\x47\x01\x50\x31\xC0\x50\xB8\xFE\xA0x7C\xFF\xD0
[ opcode @ 18.07.2006. 19:20 ] @
Zelite da kazete da nema nacina da odredim fiksalnu adresu od ShellExecuteA apija.. ja sam probao i tako nece nikako da radi.. jedino onda da ga pozivam dinamicki preko LoadLibrary pa preko GetProcAddress da saznam adresu.. mada kolki ce onda bit shellcode?!
[ opcode @ 18.07.2006. 21:07 ] @
Evo kako bi to onda izgledalo.. mada opet ne radi jer ni od te 2 fje nisu fiksalne adrese.. jexem ti gnjidovze
Code:
#include <iostream>
#include <windows.h>
using namespace std;
int main(int argc, char* argv[])
{
asm{ mov edi,0012E224H
mov byte ptr[edi+01H],6FH //o
mov byte ptr[edi+02H],70H //p
mov byte ptr[edi+03H],65H //e
mov byte ptr[edi+04H],6EH //n
xor ah,ah
mov byte ptr[edi+05H],ah //00h
mov byte ptr[edi+06H],68H // h
mov byte ptr[edi+07H],74H // t
mov byte ptr[edi+08H],74H // t
mov byte ptr[edi+09H],70H // p
mov byte ptr[edi+0AH],3AH // :
mov byte ptr[edi+0BH],2FH // /
mov byte ptr[edi+0CH],2FH // /
mov byte ptr[edi+0DH],77H // w
mov byte ptr[edi+0EH],77H // w
mov byte ptr[edi+0FH],77H // w
mov byte ptr[edi+10H],2EH // .
mov byte ptr[edi+11H],67H // g
mov byte ptr[edi+12H],6FH // o
mov byte ptr[edi+13H],6FH // o
mov byte ptr[edi+14H],67H // g
mov byte ptr[edi+15H],6CH // l
mov byte ptr[edi+16H],65H // e
mov byte ptr[edi+17H],2EH // .
mov byte ptr[edi+18H],63H // c
mov byte ptr[edi+19H],6FH // o
mov byte ptr[edi+1AH],6DH // m
xor ah,ah
mov byte ptr[edi+1BH],ah // 00h
//___________________________________
mov esi,0012E274H
mov byte ptr[esi+01h],73h //s
mov byte ptr[esi+02h],68h //h
mov byte ptr[esi+03h],65h //e
mov byte ptr[esi+04h],6Ch //l
mov byte ptr[esi+05h],6Ch //l
mov byte ptr[esi+06h],33h //3
mov byte ptr[esi+07h],32h //2
mov byte ptr[esi+08h],2Eh //.
mov byte ptr[esi+09h],64h //d
mov byte ptr[esi+0ah],6Ch //l
mov byte ptr[esi+0bh],6Ch //l
xor ah,ah
mov byte ptr[esi+0ch],ah //00h
mov byte ptr[esi+0dh],53h //S
mov byte ptr[esi+0eh],68h //h
mov byte ptr[esi+0fh],65h //e
mov byte ptr[esi+10h],6Ch //l
mov byte ptr[esi+11h],6Ch //l
mov byte ptr[esi+12h],45h //E
mov byte ptr[esi+13h],78h //x
mov byte ptr[esi+14h],65h //e
mov byte ptr[esi+15h],63h //c
mov byte ptr[esi+16h],75h //u
mov byte ptr[esi+17h],74h //t
mov byte ptr[esi+18h],65h //e
mov byte ptr[esi+19h],41h //A
xor ah,ah
mov byte ptr[esi+1ah],ah //00h
lea eax,[esi+01h]
push eax
mov eax,0x7c801d77
call eax //LoadLibrary
mov ebx,eax
lea eax,[esi+0dh]
push eax
push ebx
mov eax,0x7c80ac28
call eax //GetProcAddress
mov ebx,eax
//_____________________________________
mov eax,1
push eax
xor eax,eax
push eax
push eax
lea eax,[edi+06h]
push eax
lea eax,[edi+01H]
push eax
xor eax,eax
push eax
mov eax,ebx
call eax //ShellExecuteA
}
system("PAUSE");
return 0;
}
[ Mikky @ 19.07.2006. 08:29 ] @
[quote] Mikky: Mislim da ti je greska ovde:
Code:
lea eax,[edi+01H]
push eax
Ovo ce ti gurnuti na stack adresu stringa "pen" a ne "open". Za "open" uradi samo:
Code:
push edi
[ opcode @ 19.07.2006. 10:41 ] @
Nije u tome, taj dio je u redu.. gledam ja iz debagera sta se desava.. uzima on "open".. problem je kod GetProcAddress mislim.. jer LoadLibrary odradi posao i u EAX je HModule, a nakon GetProcAddress-a u EAX-u je 0.. mislim da je problem sto stack svaki put pocne i zavrsi od druge adrese tako da je ovaj dio problematican:
mov edi,0012E224H... Preko EBP-a ne smijem stavljat jer ce EBP bit prepisan poslije..
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|