我正在学习如何编写 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 声明为指向返回 int 的函数的指针,没有原型(prototype)。
int (*func)();
将衰减为指向数组中第一个字符的指针的数组转换为指向没有原型(prototype)的返回
int
的函数的指针,并将其分配给func
.这当然具有完全未定义的行为。func = (int (*)()) code;
第三行是其中最糟糕的:
(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/