[ 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..