【问题标题】:Need chars to void function its address?需要字符来使其地址无效吗?
【发布时间】: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 方式。遵循您描述的路线的漏洞利用依赖于触发未定义的行为,实际上至少在某些时候恰好有利于攻击者。这并不能使它们可靠。它确实使此类向量成为编译器和操作系统试图禁用的东西,这是您不应依赖将数据作为代码执行的一个独立原因。

标签: c++ c


【解决方案1】:

也许吧。

C 标准和 C++ 标准对此都有答案。对于他们俩来说,这是未定义的行为。如果可能的话,它可能会因实施而异。

如果你给我们一个特定的编译器,我们也许可以回答。

【讨论】:

  • 我会说他们有一个很好的答案:不要这样做!他们只是称之为更友好一点:未定义的行为。而且,不:UB 没有变化,那将是实现定义。一旦调用了 UB,就没有进一步调查的用处了。
猜你喜欢
  • 1970-01-01
  • 2011-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-26
  • 2013-10-29
  • 2018-01-18
  • 2017-08-06
相关资源
最近更新 更多