【发布时间】:2015-10-12 18:31:42
【问题描述】:
需要我指定 char 数组操作码 (&opcodes) 的地址吗?我正在转换为 void 指针,然后我看到确实再次指定了地址(fp 将地址指向操作码 -> 指向操作码)。
char opcodes[] = "\x41\x41...";
void main()
{
void(*fp) (void);
fp = (void *)&opcodes; // opcodes or &opcodes
fp();
}
【问题讨论】:
-
C 标准不对这样的代码做任何保证。
-
函数指针和 void* 是不同的(不兼容的)类型,使用内联汇编
-
编译器和/或运行时可能会将
opcodes中的数据放在标记为“不可执行”的内存中。你可能无法做你想做的事。这一切本质上都是不可移植的。 -
C 可以为哈佛架构编译。
-
@Joe,C 不提供任何 defined 方式。遵循您描述的路线的漏洞利用依赖于触发未定义的行为,实际上至少在某些时候恰好有利于攻击者。这并不能使它们可靠。它确实使此类向量成为编译器和操作系统试图禁用的东西,这是您不应依赖将数据作为代码执行的一个独立原因。