[英]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.