gpt4 book ai didi

c - 帮我理解这段C代码 (*(void(*) ()) scode) ()

转载 作者:行者123 更新时间:2023-12-02 05:21:20 25 4
gpt4 key购买 nike

来源:http://milw0rm.org/papers/145

#include <stdio.h>
#include <stdlib.h>

int main()
{
char scode[]="\x31\xc0\xb0\x01\x31\xdb\xcd\x80";
(*(void(*) ()) scode) ();
}

这篇论文是Linux平台上的shellcode教程,但是它没有解释下面的语句“(*(void(*) ()) scode) ();”是如何工作的。我正在使用“The C Language Programming Reference, 2ed by Brian.W.Kernighan, Dennis.M.Ritchie”这本书来寻找答案,但没有找到答案。可能有人可以指出正确的方向,也许是一个网站,另一本 C 引用书,我可以在其中找到答案。

最佳答案

scode 中的机器代码(编译后的汇编指令)然后转换为可调用的 void 函数指针并调用它。 GMan展示了一种等效的、更清晰的方法:

typedef void(*void_function)(void);
int main()
{
char scode[]="\x31\xc0\xb0\x01\x31\xdb\xcd\x80";
void_function f = (void_function)scode;
f(); //or (*f)();
}

scode 包含反汇编成的 x86 机器码(感谢 Michael Berg )

31 c0        xor    %eax,%eax
b0 01 mov $0x1,%al
31 db xor %ebx,%ebx
cd 80 int $0x80

这是 Linux 系统调用的代码(中断 0x80)。根据system call table ,这是使用参数 0(在 ebx 中)调用 sys_exit() 系统调用 (eax=1)。这会导致进程立即退出,就好像它调用了_exit(0)一样。 .

Jonathan Leffler指出这是最常用来调用shellcode ,“一小段代码用作利用软件漏洞的有效负载。”因此,现代操作系统采取措施防止这种情况发生。

如果堆栈是不可执行的,这段代码就会失败。 shell 代码被加载到堆栈中的一个局部变量中,然后我们跳转到那个位置。如果堆栈是不可执行的,那么一旦 CPU 尝试执行代码,就会发生某种 CPU 故障,控制权将转移到内核的中断处理程序中。然后内核将以异常方式终止进程。堆栈可能不可执行的一种情况是,如果您在支持 Physical Address Extensions 的 CPU 上运行,并且您在页表中设置了 NX(不可执行)位。

某些 CPU 上也可能存在指令缓存问题——如果指令缓存未被刷新,CPU 可能会读取陈旧数据(而不是我们明确加载到堆栈中的 shell 代码)并开始执行随机指令。

关于c - 帮我理解这段C代码 (*(void(*) ()) scode) (),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1469559/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com