Можно ли заставить функцию выполнять код из строки в стеке? - PullRequest
8 голосов
/ 12 июля 2010
#include <stdio.h>

int main(int argc, char** argv)
{
    void (*p) (void);
    /* this obviously won't work, but what string could I put in 
       here (if anything) to make this execute something meaningful?
       Does any OS allow instructions to be read from
       the stack rather than text area of the process image? */
    char *c = "void f() { printf(\"Hello, world!\"); }";
    p = ( void (*)() )c;
    p();
    return 0;
}

Ответы [ 3 ]

8 голосов
/ 12 июля 2010

В некотором роде, но не совсем, * нет 1001 *eval() в c, как во многих языках сценариев.

Однако то, что вы описываете, похоже на Эксплойт по переполнению буфера .

Где вы используете строку для записи «кода» (не синтаксиса c, а машинного кода) в адресное пространство после буфера.Вот хороший учебник темы.

Не используйте эту информацию для написания вируса: (

6 голосов
/ 12 июля 2010

Вы можете использовать libtcc для компиляции и запуска исходного кода C:

const char *code = "int main(int argc, char**argv) { printf(\"Hello, world!\"); return 0; }";
TCCState *tcc = tcc_new();

if (tcc_compile_string(tcc, code))
{
    // an error occurred compiling the string (syntax errors perhaps?)
}

int argc = 1;
char *argv[] = { "test" };

int result = tcc_run (tcc, argc, argv);

// result should be the return value of the compiled "main" function.
// be sure to delete the memory used by libtcc

tcc_delete(tcc);

Пара проблем:

  1. Вы можете компилировать толькоlibtcc в поддерживаемой архитектуре.
  2. Вам необходима функция main.
3 голосов
/ 12 июля 2010

Конечно, это возможно. Эксплойты переполнения буфера используйте его.

См. Shellcode о том, какие строки вы можете разместить.

По сути, вы можете поместить машинный код в стек и перейти к адресу. Это приведет к выполнению (если ОС / компьютер это позволяет, см. NX bit ).

Возможно, вы даже можете попытаться создать memcpy из адреса некоторой функции в строку в стеке, а затем попытаться перейти к адресу в стеке.

...