Помогите закончить с шеллкодом

Тема в разделе "WASM.BEGINNERS", создана пользователем seregik, 16 июл 2010.

Статус темы:
Закрыта.
  1. seregik

    seregik New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2009
    Сообщения:
    7
    Добрый день,
    Имеется шеллкод:

    Код (Text):
    1. BYTE code[] =
    2.     {
    3.         0x68, 0, 0, 0, 0,           // push (POINTER TO PROCESS_INFORMATION)        offset +1
    4.         0x68, 0, 0, 0, 0,           // push (Pointer to STARTUPINFO) offset         offset +6
    5.         0x6A, 0,                // push 0 (LPCTSTR lpCurrentDirectory)          offset +11
    6.         0x6A, 0,                // push 0 (LPVOID lpEnvironment)                offset +13
    7.         0x6A, 0,                // push 0 (DWORD dwCreationFlags)           offset +15
    8.         0x6A, 0,                // push 0 (Set handle inheritance to FALSE)     offset +17
    9.         0x6A, 0,                // push 0 (Thread handle not inheritable)               offset +19
    10.         0x6A, 0,                // push 0 (Process handle not inheritable)              offset +21
    11.         0x68, 0, 0, 0, 0,           // push (Command line)                      offset +23
    12.         0x6A, 0,                // push (No module name (use command line))     offset +28
    13.         0xE8, 0, 0, 0, 0,           // call CreateProcessW                      offset +30
    14.         0x83, 0xF8, 0x0,            // cmp eax, 0h                          offset +35
    15.         0x0F, 0x84, 0,0,0,0,        // je  + after close handles                    offset +38
    16.         ???????????????????????????????????????????????????
    17.         0xC2, 0x04, 0               // retn 4
    18.     };
    Который запускает процесс.
    Выполнение шеллкода осуществляется вызовом CreateRemoteThread

    В таргет процессе выделяется место под него и копируется непосредственно сам шеллкод:

    Код (Text):
    1. ......
    2.  
    3. regionSize = sizeof(code);
    4. regionSize += sizeof(PROCESS_INFORMATION) + sizeof(STARTUPINFOW) + filepath.MaximumLength;
    5.  
    6. status = ZwAllocateVirtualMemory(hTargetProcess,&pCode,0,&regionSize,MEM_RESERVE|
    7. MEM_COMMIT,PAGE_EXECUTE_READWRITE);
    8.  
    9. .....
    10.  
    11.         //
    12.     // Attaching to Target Process And Copy shellcodeTemplate
    13.     // Than correcting some values.
    14.     //
    15.  
    16.     if(NT_SUCCESS(status)){
    17.  
    18.         KeStackAttachProcess(pTarget,&apcState);
    19.         RtlZeroMemory(pCode,regionSize);
    20.  
    21.         pSi = (PSTARTUPINFOW) (pCode + sizeof(code));
    22.         pPi = (PPROCESS_INFORMATION) (pCode + sizeof(code) + sizeof(STARTUPINFOW));
    23.         szPath = (LPTSTR) (pCode +sizeof(code) + sizeof(STARTUPINFOW)+ sizeof(PROCESS_INFORMATION));
    24.  
    25.         RtlCopyMemory(pCode,code,sizeof(code));
    26.         RtlCopyMemory(szPath, filepath.Buffer, filepath.MaximumLength);
    27.  
    28.         *((PULONG) (pCode + 1)) = (ULONG) pPi;
    29.         *((PULONG) (pCode + 6)) = (ULONG) pSi;
    30.         *((PULONG) (pCode + 23)) = (ULONG) szPath;
    31.         *((PLONG) (pCode + 30)) = (LONG) (((PBYTE) pCreateProcessW) - (pCode + 30) - 5 + 1);
    32.         *((PULONG) (pCode + 39)) = (ULONG) pCode + 64;
    33.         debugp("Je to 0x%X\n",pCode + 64);
    34.  
    35.         KeUnstackDetachProcess(&apcState);
    36.     }
    Внимание вопрос, что надо дописать в шеллкод на место знаков вопроса
    чтобы:

    - Поместить в стек значение кот находится по адресу &pPi->hProcess (на
    этапе формирования шеллкода оно не изветсно, будет известно только после вызова CreateProcess)

    Т.к. в ассемблере не силен, прошу помощи коллективного разума.
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    seregik
    Шелкод чтото переполняет, у вас я переполнений не вижу. Уже давно термины сменили, ну или уточнили. Поиск нужно использовать вначале, дельтасмещение, пикод, морфинг и пр. Опкодами никто не кодит при наличие компилятора. Более того вопрос не понятен, что в стек поместить ?
    Задайте себе вопрос как найти текущий адрес в коде и помните что размер инструкций фиксирован, вы сами придёте к решению.
     
  3. seregik

    seregik New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2009
    Сообщения:
    7
    Под шеллкодом я имел ввиду - код кот. размещается в ап другого процесса, затем на него передается управление по средству CreateRemoteThread, видать ошибся в терминологии.

    Уточню вопрос про стек:
    На этапе формирования этого так сказать шеллкода у меня есть адрес(указатель) куда CreateProcess запишет значение например описателя созданного процесса. Дальше в этом же коде на этом же этапе мне надо зная адрес этого описателя поместить значение описателя в стек. Т.е. говоря терминами си мне надо бы этот указатель разыменовать и передать значение параметром в CloseHandle например (чтото типа push *pointer =) ).

    Так вот как поместить значение кот. хранится по адресу 0xXXXXXXXX
    в стэк на ассемблере?
     
  4. qwe8013

    qwe8013 New Member

    Публикаций:
    0
    Регистрация:
    28 май 2009
    Сообщения:
    198
    seregik
    push [0xXXXXXXXX]
    или
    db 0FFh,32h
    dd 0xXXXXXXXX
     
  5. seregik

    seregik New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2009
    Сообщения:
    7
    Спасибо.
    И еще один вопрос: Как это записать опкодом?

    0x68 - опкод push
    а какой тогда получается опкод push [...] ?
     
  6. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    PUSH DWORD PTR DS:[99AABBCC] FF35 CCBBAA99
    отладчик еще не отменяли ).
     
  7. seregik

    seregik New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2009
    Сообщения:
    7
    Всем спасибо за ответы, вопрос закрыт :)
     
Статус темы:
Закрыта.