【问题标题】:pointer casting in c [shellcode test]c中的指针转换[shellcode测试]
【发布时间】:2018-07-23 07:59:38
【问题描述】:

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

【问题讨论】:

    标签: c shellcode


    【解决方案1】:

    代码本身不仅具有未定义的行为,而且在没有定义的地方都是不好的。让我们来看看:

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

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

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

      (int)(*func)();
      

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

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

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

    即将code 转换为指向函数的指针,该函数返回void,不带任何参数,然后调用它。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 值得注意的是,las 行的语法是不必要的复杂,一个简单的func(); 就足够了。
      • 谢谢!!这澄清了很多事情。现在说得通了^^
      • 请注意,这不是一个不带参数的函数指针。它需要任意数量的参数!试试吧!
      • 好的,我已经删除了那行,谢谢你的澄清。是的,最后一行是不必要的混乱。
      猜你喜欢
      • 2021-02-26
      • 1970-01-01
      • 2021-07-11
      • 1970-01-01
      • 1970-01-01
      • 2016-08-24
      • 2021-06-06
      • 1970-01-01
      相关资源
      最近更新 更多