Добрый день, Имеется шеллкод: Код (Text): BYTE code[] = { 0x68, 0, 0, 0, 0, // push (POINTER TO PROCESS_INFORMATION) offset +1 0x68, 0, 0, 0, 0, // push (Pointer to STARTUPINFO) offset offset +6 0x6A, 0, // push 0 (LPCTSTR lpCurrentDirectory) offset +11 0x6A, 0, // push 0 (LPVOID lpEnvironment) offset +13 0x6A, 0, // push 0 (DWORD dwCreationFlags) offset +15 0x6A, 0, // push 0 (Set handle inheritance to FALSE) offset +17 0x6A, 0, // push 0 (Thread handle not inheritable) offset +19 0x6A, 0, // push 0 (Process handle not inheritable) offset +21 0x68, 0, 0, 0, 0, // push (Command line) offset +23 0x6A, 0, // push (No module name (use command line)) offset +28 0xE8, 0, 0, 0, 0, // call CreateProcessW offset +30 0x83, 0xF8, 0x0, // cmp eax, 0h offset +35 0x0F, 0x84, 0,0,0,0, // je + after close handles offset +38 ??????????????????????????????????????????????????? 0xC2, 0x04, 0 // retn 4 }; Который запускает процесс. Выполнение шеллкода осуществляется вызовом CreateRemoteThread В таргет процессе выделяется место под него и копируется непосредственно сам шеллкод: Код (Text): ...... regionSize = sizeof(code); regionSize += sizeof(PROCESS_INFORMATION) + sizeof(STARTUPINFOW) + filepath.MaximumLength; status = ZwAllocateVirtualMemory(hTargetProcess,&pCode,0,®ionSize,MEM_RESERVE| MEM_COMMIT,PAGE_EXECUTE_READWRITE); ..... // // Attaching to Target Process And Copy shellcodeTemplate // Than correcting some values. // if(NT_SUCCESS(status)){ KeStackAttachProcess(pTarget,&apcState); RtlZeroMemory(pCode,regionSize); pSi = (PSTARTUPINFOW) (pCode + sizeof(code)); pPi = (PPROCESS_INFORMATION) (pCode + sizeof(code) + sizeof(STARTUPINFOW)); szPath = (LPTSTR) (pCode +sizeof(code) + sizeof(STARTUPINFOW)+ sizeof(PROCESS_INFORMATION)); RtlCopyMemory(pCode,code,sizeof(code)); RtlCopyMemory(szPath, filepath.Buffer, filepath.MaximumLength); *((PULONG) (pCode + 1)) = (ULONG) pPi; *((PULONG) (pCode + 6)) = (ULONG) pSi; *((PULONG) (pCode + 23)) = (ULONG) szPath; *((PLONG) (pCode + 30)) = (LONG) (((PBYTE) pCreateProcessW) - (pCode + 30) - 5 + 1); *((PULONG) (pCode + 39)) = (ULONG) pCode + 64; debugp("Je to 0x%X\n",pCode + 64); KeUnstackDetachProcess(&apcState); } Внимание вопрос, что надо дописать в шеллкод на место знаков вопроса чтобы: - Поместить в стек значение кот находится по адресу &pPi->hProcess (на этапе формирования шеллкода оно не изветсно, будет известно только после вызова CreateProcess) Т.к. в ассемблере не силен, прошу помощи коллективного разума.
seregik Шелкод чтото переполняет, у вас я переполнений не вижу. Уже давно термины сменили, ну или уточнили. Поиск нужно использовать вначале, дельтасмещение, пикод, морфинг и пр. Опкодами никто не кодит при наличие компилятора. Более того вопрос не понятен, что в стек поместить ? Задайте себе вопрос как найти текущий адрес в коде и помните что размер инструкций фиксирован, вы сами придёте к решению.
Под шеллкодом я имел ввиду - код кот. размещается в ап другого процесса, затем на него передается управление по средству CreateRemoteThread, видать ошибся в терминологии. Уточню вопрос про стек: На этапе формирования этого так сказать шеллкода у меня есть адрес(указатель) куда CreateProcess запишет значение например описателя созданного процесса. Дальше в этом же коде на этом же этапе мне надо зная адрес этого описателя поместить значение описателя в стек. Т.е. говоря терминами си мне надо бы этот указатель разыменовать и передать значение параметром в CloseHandle например (чтото типа push *pointer =) ). Так вот как поместить значение кот. хранится по адресу 0xXXXXXXXX в стэк на ассемблере?
Спасибо. И еще один вопрос: Как это записать опкодом? 0x68 - опкод push а какой тогда получается опкод push [...] ?