我查遍了整个网络,但没有找到任何东西。
我想知道它是如何有意义的,例如当您输入:
char *buffer = "Everything! such as shellcodes"
int ret;
ret = (int *)& ret +2 ;
(*ret) = (int)buffer;
或者当你使用:
(* (void(*) ()) shellcode)();
哪个 shellcode 是 char 指针。
我知道&给出了变量的地址,但我不知道
(int *) then address of something
我认为它会覆盖 EIP。 但第二个代码它实际上做了什么?
我知道这也许不是一个好问题,但我想知道如何深入了解指针及其类型转换。
您介意通过一篇文章、一本书或......向我提供该问题的概念吗? 我想学这个来自己理解并写出这样的东西。
非常感谢。
最佳答案
内存仅包含数据字节。如何解释这些数据取决于您。
您的缓冲区可能会被解释为int
。例如:
char buffer[] = {1, 2, 3, 4};
int number = *(int *)buffer;
在 Intel x86 处理器上运行代码将导致 number
的值为 0x04030201
,因为整数存储为 32 位(4 字节)小端缓冲区。
您的缓冲区也可以解释为代码。 C 代码 return 5;
可以编译成以下 x86 汇编代码:
mov eax, 5
retn
此代码在内存中看起来为 B8 05 00 00 00 C3
让我们看一下下面的例子:
char buffer[] = {0xb8, 5, 0, 0, 0, 0xc3};
int number = ((int (*)())(buffer))();
在 Intel x86 处理器上运行此代码(假设您编译此代码时没有进行阻止数据缓冲区执行的安全检查)将导致 number
的值为 5;该代码将指向 buffer
的指针转换为指向具有签名 int func_name()
的函数的指针,然后执行它。
关于c++ - C/C++ 中的高级指针类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25708310/