繁体   English   中英

在C中调用缓冲区作为函数?

[英]Calling buffer as a function in C?

char buf[sizeof(shellcode)];
strcpy(buf, shellcode);
((void(*)())buf)();

我很难理解第三行的语法,我认为它正在使缓冲区成为一个函数?

你对第三行是正确的。 它需要buf ,将其衰减为指针,然后将该指针强制转换为指向函数的指针。 然后它调用该函数。 这是有效的,因为void(*)()表示“指向不接受任何参数并返回void的函数的指针”,并将其包装在括号中会将其转换为强制转换。 您现在有一个指向函数的指针,您可以将其称为常规函数名称。

C标准不允许这样做,但基于编译器的工作方式可能意味着它将buf的地址视为内存中函数的地址并尝试调用该函数。 通常这不起作用,因为操作系统会告诉CPU标记内存区域buf是不可执行的,所以当你试图假装它是一个函数时,CPU会抛出一个错误; 让我们假设操作系统没有这样做,或者你有一个足够老的CPU,它不支持它。

您没有向我们展示shellcode的内容。 由于计算机中的所有内容都只是一个字节序列,包括计算机运行的已编译二进制代码,因此shellcode可能包含可执行的二进制代码。 如果是,则会导致代码开始运行。

例如,如果您编译

void mycode()
{
    puts("Hello, world!");
}

然后,您可以从生成的目标文件mycode提取函数mycode的内容。 如果你把这些内容放到shellcode ,那么你的问题中的代码就会(假设编译器对指针指向函数和指向数据的指针相同,并且操作系统或CPU不支持noexec内存)打印Hello, world! 到屏幕。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM