测试一个shellcode

14

我有这段代码用于测试shellcode,但是我不理解它,能否有人给我解释一下?

忘掉汇编shellcode,我想理解的是C代码。

char shellcode[] = "...";

int main(int argc, char **argv)

{

int (*func)();

func = (int (*)()) shellcode;

(int)(*func)();

}
我是指什么都包括,那个空的(),请像向初学者解释一样解释它。

由于 shell 代码“不重要”,我已省略它(只是为了安全起见)。 - Marcelo Cantos
1
用户名似乎是被CIA和GCHQ数据库追踪的好方法。再加上这个问题,你可能随时都会收到SAS的拜访... - anon
2个回答

16
int (*func)();

这是一个函数指针的声明。函数指针本质上是保存函数地址的变量。在此情况下,func 指向的函数类型是一个不带参数并返回 int 的函数。您可以将一个函数的地址分配给这个变量,例如:

func = foo;

假设有一个原型为int foo();的函数 foo

一旦将一个函数分配给该变量,您可以像这样调用指向func的函数:

(*func)();

还有一种语法(等价的),我认为更清晰易懂:

func();

如果将foo分配给func,那么上面两个示例实际上都会调用函数foo

你还可以将值转换为函数指针。在代码示例中:

(int (*)())

这是将一个不带参数并返回 int 的函数指针强制转换,以避免编译器对将基本上是 char* 的值赋给函数指针 func 抱怨。

在你提供的代码中,还有一件事情。在调用 func 后,结果被(由于某种原因)强制转换为 int。就我所知,这个强制转换是完全没有必要的。所以最后一行:

(int)(*func)();

可以被替换为

(*func)();

3

int (*func)(); 是指向返回类型为 int 的函数的指针的定义,func = (int (*)()) shellcode; 将函数指针赋值为 shellcode[] 的地址(汇编字节码,即 CPU 执行的指令),(int)(*func)(); 通过其地址(汇编指令)调用函数,因为指定了 (),没有传递任何参数。例如,汇编指令 \x90 的名称为 NOPN o Op eration),什么也不做,其他汇编指令根据所执行的系统而有所不同。


谢谢Yasir,但是我没有理解得很好,所以func = (int (*)()) shellcode,它是做什么的?它会将shellcode的地址放入func中吗?这个函数是否已经实现? - 0xab3d
1
对于问题的提出者:C语言中的每个函数都有一个地址,func = (int (*)()) shellcode; 告诉编译器函数代码从 shellcode[] 的第一个字节开始。但是你有一个只包含汇编代码的函数。由于每个C程序在编译后都会变成汇编代码,这不是问题,调用 (int)(*func)(); 应该会执行你放在 shellcode[] 中的汇编指令。 - YasirA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接