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

标签 c shellcode

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

最佳答案

代码本身不仅有未定义的行为,而且如果没有的话,它就是不好的。让我们过一遍这些行:

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

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

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

    (int)(*func)();
    

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

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

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

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

关于c - C 中的指针转换 [shellcode 测试],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51474075/

相关文章:

C 程序将一棵二叉搜索树复制到另一棵

c - 如何在C中将十六进制字符串(带 float )转换为二进制?

c - 尝试更通用的 c 代码,自定义数据结构,在双链表中,这可能吗?

c - 使用 strcat 超过 1 次 - link2019

c - 程序在 GDB 中的行为不同?

c - 为单个子例程关闭 sudo(root 权限)

linux - 从 shellcode 运行文件

c - 如何正确地将汇编程序转换为shellcode?

c - 如何在gdb中动态插入复杂输入

c - 需要检测任何可能的缓冲区溢出