我试图理解为什么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/