我试图理解为什么ret();在以下C程序中工作:

#include<stdio.h>
#include<string.h>

unsigned char code[] = \
"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69"
"\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80";

main()
{
    printf("Shellcode Length:  %d\n", strlen(code));
    int (*ret)() = (int(*)())code;
    ret();
}

为了使其工作,您必须在没有堆栈保护的情况下编译上面的代码,允许堆栈是可执行的。
但我想知道的是,为什么调用ret();,它似乎是分配给值(int(*)())code;的整数。
我猜这与函数指针实际上是整数有关系,但我还无法从思想上解开表达式的含义
谢谢你的帮助

最佳答案

我想知道的是为什么调用ret(),它似乎是一个分配给(int(*)())code值的整数
ret不是整数,而是指向返回整数的函数的指针。“inline”语法,即int (*ret)()比等效的typedef更难“破译”。

typedef int (*func_returning_int)();
...
func_returning_int ret = (func_returning_int)code;

注意:不用说,这是一个未定义的行为,无论您如何进行指针的投射。

关于c - 在C中的数组中执行机器代码。这是否在执行Integer?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45822385/

10-17 01:26