#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;
}
答案 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);
一系列问题:
libtcc
。main
功能。答案 2 :(得分:3)
当然有可能。 Buffer Overflow exploits使用它。
请参阅Shellcode了解您可以放置哪种字符串。
基本上你可以做的就是将机器代码放在堆栈上并跳转到地址。这将导致执行(如果OS /机器允许执行,请参阅NX bit)。
你甚至可以尝试从一些函数地址到一个字符串上的memcpy,然后尝试跳转到堆栈上的地址。