c 中的指针转换 [shellcode 测试]

pointer casting in c [shellcode test]

我正在学习有关如何编写 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的结果

您定义了一个函数指针 func,它指向一个将 return 一个整数的函数。

在第二行中,您将字节码分配给该函数指针,但您必须先将其转换为函数指针,字符数组和函数指针之间没有默认转换。

最后,你尝试调用func指向的函数,希望能执行你的字节码。

代码本身不仅有未定义的行为,没有的地方也很糟糕。让我们来看看这些行:

  1. 将 func 声明为指向函数的指针returning 一个 int,没有原型。

    int (*func)();
    
  2. 将衰减为指向数组中第一个字符的指针的数组转换为指向没有原型的函数 returning int 的指针,并将其分配给func。这当然有完全未定义的行为。

    func = (int (*)()) code;
    
  3. 第三行是最糟糕的:

    (int)(*func)();
    

    这里我们用*func解引用函数指针,然后它立即衰减 回到函数指针,因为它受制于仅适用于 函数指针 的函数调用运算符!然后 return 值,即 int,被转换为 int,然后被丢弃。

第3行当然应该写成func();。由于 return 值很可能是通过寄存器处理的,而我们对此不感兴趣,因此 shellcode 函数的原型应该是 void shellcode(void)。最后,函数指针在这里不需要变量。因此我们可以写

( (void (*)(void)) code ) ();

即将 code 转换为指向函数 returning void 不带参数的指针,然后调用它。