Всем привет! В учебных целях изучаю шеллкодинг. Нашел в интернете ассемблерные инструкции по удалению заданного ключа из реестра, "подогнал" код под свои адреса 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вообще, exe-шник имеет следующий байт код:
, но на основании примеров из интернета, я беру только код из красной области. Байты из зеленой области, как я понял, это информация линкера 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, никаких настроек в нем не менял. В чем может быть проблема?
Заранее спасибо за помощь