10
#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;
}
4

3 回答 3

11

有点,但不是真的,eval()在 c 中没有,就像在许多脚本语言中一样。

但是,您所描述的有点像Buffer Overflow 漏洞利用

其中,您使用字符串将“代码”(不是 c 语法,而是机器代码)写入缓冲区之后的地址空间。这是该主题的一个不错的小教程

不要使用此信息编写病毒 :(

于 2010-07-12T00:03:06.203 回答
8

您可以使用它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功能。
于 2010-07-12T00:38:40.287 回答
3

当然有可能。缓冲区溢出漏洞利用它。

有关可以放置哪种字符串的信息,请参阅Shellcode 。

基本上你可以做的是把机器代码放在堆栈上并跳转到地址。这将导致执行(如果操作系统/机器允许,请参阅NX 位)。

您甚至可以尝试从某个函数地址执行 m​​emcpy 到堆栈上的字符串,然后尝试跳转到堆栈上的地址。

于 2010-07-11T23:57:43.997 回答