我正在跟踪有关如何编写shellcode的教程,但是我无法理解指针函数强制转换对字节码的作用,有人可以向我解释吗?
char code[] = "bytecode will go here!";
int main(int argc, char **argv)
{
int (*func)();
func = (int (*)()) code;
(int)(*func)();
}
代码类似于这样的“ \ xb0 \ x01 \ x31 \ xdb \ xcd \ x80”,这是因为退出是汇编代码的objdump的结果
答案 0 :(得分:0)
您定义一个函数指针func
,该指针指向将返回整数的函数。
在第二行中,将字节码分配给该函数指针,但是必须首先将其强制转换为函数指针,字符数组和函数指针之间没有默认转换。
最后,您尝试调用func
指向的函数,从而希望执行您的字节码。
答案 1 :(得分:0)
代码本身不仅具有未定义的行为,而且在没有行为的地方也很糟糕。让我们仔细看一下:
将func声明为返回没有原型的int函数的指针。
int (*func)();
将衰减到指向数组中第一个字符的指针的数组投射到指向返回没有原型的int
的函数的指针中,并将其分配给func
。当然,这完全是不确定的行为。
func = (int (*)()) code;
第三行是其中最差的:
(int)(*func)();
在这里,我们用*func
取消引用函数指针,然后它立即衰减
回到函数指针,因为它受函数调用操作符的约束,该操作符仅与函数指针一起使用!然后将返回值int
强制转换为int
,然后将其丢弃。
当然,第三行应该写为func();
。而且由于返回值很可能是通过寄存器处理的,并且我们对此不感兴趣,因此shellcode函数的原型应该是void shellcode(void)
。最后,这里不需要为函数指针使用变量。因此我们可以写
( (void (*)(void)) code ) ();
即将code
强制转换为不返回任何参数的void
函数的指针,然后调用它。