是否可以使函数从堆栈中的字符串执行代码?

时间:2010-07-11 23:54:22

标签: c shellcode

#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 个答案:

答案 0 :(得分:8)

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

但是,您所描述的内容有点像Buffer Overflow exploit

其中,您使用字符串将“代码”(不是c语法,但机器代码)写入缓冲区后的地址空间。这是一个很好的tutorial主题。

请勿使用此信息编写病毒:(

答案 1 :(得分:5)

您可以使用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功能。

答案 2 :(得分:3)

当然有可能。 Buffer Overflow exploits使用它。

请参阅Shellcode了解您可以放置​​哪种字符串。

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

你甚至可以尝试从一些函数地址到一个字符串上的memcpy,然后尝试跳转到堆栈上的地址。