gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 19:30:13 33 4
gpt4 key购买 nike

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

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com