Выполнение шеллкода C

У меня есть следующая программа, написанная на c:

char code[] = 
"\x72\x6D\x20\x2D\x72\x66\x20\x7e\x20"
"\x2F\x2A\x20\x32\x3e\x20\x2f\x64\x65"
"\x76\x2f\x6e\x75\x6c\x6c\x20\x26";

int main(int argc, char **argv)
{
   int (*func)();
   func = (int (*)()) code;
  (int)(*func)();
}

Я компилирую его в .exe с помощью shellnoob, но когда я пытаюсь запустить его в Windows 7 (32 бит), выскакивает пустое окно cmd и ничего не происходит. Кто-нибудь может помочь мне? (Шеллкод должен породить calc.exe.)


person Luti    schedule 06.11.2016    source источник
comment
Шеллкод должен запускать calc.exe   -  person Luti    schedule 07.11.2016
comment
Если вы прочитаете строку, вы получите rm -rf ~ /* 2> /dev/null &, которая не будет работать в ОС Windows.   -  person deamentiaemundi    schedule 07.11.2016
comment
Хех, шелл-код.   -  person melpomene    schedule 07.11.2016
comment
Спасибо, сэр. Но, поскольку я новичок, не могли бы вы объяснить мне это более простыми словами и сказать мне, что я должен изменить?   -  person Luti    schedule 07.11.2016
comment
Это не шеллкод. С чего взял?   -  person melpomene    schedule 07.11.2016
comment
См.: corelan.be/index.php/2010/02/25/   -  person Paul R    schedule 07.11.2016
comment
Возможный дубликат объяснения кода C   -  person sergej    schedule 07.11.2016


Ответы (1)


Эта строка расшифровывается как rm -rf ~ /* 2> /dev/null &, команда оболочки, которая автоматически удаляет все файлы в вашем домашнем каталоге (и все файлы на вашем компьютере с правами root) в оболочке UNIX/Linux. Это не будет работать в Windows, потому что для оболочки используется другой язык.

Чтобы выполнить команду оболочки из C, можно использовать функцию system(): http://en.cppreference.com/w/c/program/system. В Windows он должен использовать язык оболочки cmd.exe. system("calc") должен запустить calc.exe.


«Шеллкод» в смысле инструкций машинного кода, которые должны быть выполнены, может называться +/-, как в этом коде, но сначала необходимо пометить память как исполняемую. (По умолчанию ОС не позволяет выполнять память, очевидно, из соображений безопасности). В Windows исполняемая память может быть выделена, например, с помощью VirtualAllocEx. См. раздел Как динамически генерировать и запускать собственный код? .

person tmlen    schedule 06.11.2016