【发布时间】:2018-02-03 03:46:04
【问题描述】:
我找到了这段代码:
goto*&L"\xfeeb";
它导致程序永远挂起,显然是通过调用 x64 指令 0xEB 和 0xFE(按此顺序,由于 x64 的小端序)。 0xEB 是根据 x86 Opcode and Instruction Reference 的 JMP。
我理解代码的作用,它相当于一个运行指令0xEB 0xFE的函数,所以也可以写成int (*foo)() = L"\xfeeb"; foo();,或者如果我们真的想得到混淆,((int(*)())L"\xfeeb")();。这是因为字符串在 Linux 上默认标记为可执行。
不过,goto 真的很严格。我不明白为什么goto*&L"\xfeeb"; 完全有效,或者疯狂的指针魔术*& 在做什么,或者为什么需要宽标记L。谁能解释一下?
【问题讨论】:
-
如果你想在不单独编译的情况下尝试所有这些混淆的sn-ps,你可以使用在线C编译器:
goto*&L"\xfeeb";和int (*foo)() = L"\xfeeb"; foo();和((int(*)())L"\xfeeb")(); -
@user202729 仍然不明白 GCC 的哪个部分决定允许这样做。