#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;
}
问问题
6677 次
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);
几个问题:
- 您只能
libtcc
在受支持的架构上进行编译。 - 你需要有一个
main
功能。
于 2010-07-12T00:38:40.287 回答
3
当然有可能。缓冲区溢出漏洞利用它。
有关可以放置哪种字符串的信息,请参阅Shellcode 。
基本上你可以做的是把机器代码放在堆栈上并跳转到地址。这将导致执行(如果操作系统/机器允许,请参阅NX 位)。
您甚至可以尝试从某个函数地址执行 memcpy 到堆栈上的字符串,然后尝试跳转到堆栈上的地址。
于 2010-07-11T23:57:43.997 回答