@Narts

Почему не срабатывает шеллкод?

Всем привет! В учебных целях изучаю шеллкодинг. Нашел в интернете ассемблерные инструкции по удалению заданного ключа из реестра, "подогнал" код под свои адреса WinExec и ExitProcess в kernel32:
[BITS 32]

global _start

section .text

_start:
jmp short command        


function: 
pop     ecx
xor     eax,eax
push    eax
push    ecx
mov     eax,0x761451c0
call    eax

xor eax,eax
push    eax
mov eax,0x76129fe0
call    eax

command:          
call function
db "cmd.exe /c REG DELETE HKCU\keys /v key /f"
db 0x00


с помощью nasm получаю .obj и с помощью goLink получаю .exe-шник. При его запуске все ок, ключ удаляется.

Далее мне необходимо через программу на C запустить этот код. Для этого сначала получаю шелл-код: открываю exe-шник с помощью Hex-Editor и получаю байт код:
spoiler
ngKhJVO.jpg


второстепенный вопрос:
spoiler
вообще, exe-шник имеет следующий байт код:
5ce2fe9accf4c967019560.jpeg
, но на основании примеров из интернета, я беру только код из красной области. Байты из зеленой области, как я понял, это информация линкера golink. Так ли это?


Таким образом получаю следующий шелл код:
\xeb\x16\x59\x31\xc0\x50\x51\xb8\xc0\x51\x14\x76\xff\xd0\x31\xc0\x50\xb8\xe0\x9f\x12\x76\xff\xd0\xe8\xe5\xff\xff\xff


Далее (основываясь на те же примеры из интернета), нам нужно дописать шелл-команду в конец шеллкода:
\xeb\x16\x59\x31\xc0\x50\x51\xb8\xc0\x51\x14\x76\xff\xd0\x31\xc0\x50\xb8\xe0\x9f\x12\x76\xff\xd0\xe8\xe5\xff\xff\xff\"cmd.exe /c REG DELETE HKCU\keys /v key /f\"


Таким образом, код на Си для запуска шеллкода выглядит следующим образом:
#include <conio.h>
#include <windows.h>


int main() {
	int i = 0;
	char shell[500] = "\xeb\x16\x59\x31\xc0\x50\x51\xb8\xc0\x51\x14\x76\xff\xd0\x31\xc0\x50\xb8\xe0\x9f\x12\x76\xff\xd0\xe8\xe5\xff\xff\xff\"cmd.exe /c REG DELETE HKCU\keys /v key /f\"";

	WinExec(shell, (unsigned int)1);
}


но при компиляции флаг из реестра не удаляется. Компилю в visual studio 2017, никаких настроек в нем не менял. В чем может быть проблема?

Заранее спасибо за помощь
  • Вопрос задан
  • 635 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
при компиляции флаг из реестра не удаляется. В чем может быть проблема?

В том, что ты засунул бинарный код в параметр функции, в котором должна быть строка с именем программы для запуска и её параметрами. Непонятно, почему ты ожидаешь, что WinExec бросится выполнять машинный код в этой строке. WinExec имеет код возврата, который недвусмысленно тебе сказал бы в чём ошибка (путь или файл для запуска не найдены), если бы ты его проверил.
И, кстати, байт с кодом 0 по смещению 0x246 -- это тоже часть шелл-кода, терминатор командной строки.

Байты из зеленой области, как я понял, это информация линкера golink. Так ли это?

Это заголовок файла формата PE. Да, его туда записал линкер. Нет, это не информация линкера, это информация в основном для загрузчика ОС, а так же для дизассемблера и прочих binutils.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
wisgest
@wisgest
Не ИТ-специалист
Машинный код по адресу shell можно вызвать как функцию как-то так (может быть, без звёздочки)
typedef void functype(void);

((functype *)shell)();

или короче, но не уверен, что проще для понимания
(void *(void))shell)();
только надо в нём предусмотреть возврат (ret) обратно в место вызова.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы