c++ - C/C++ 中的高级指针类型转换

标签 c++ c pointers assembly casting

我查遍了整个网络,但没有找到任何东西。

我想知道它是如何有意义的,例如当您输入:

 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/

相关文章:

c++ - "Swapping values of two variables without using a third variable"中的潜在问题

c++ - 继承 SFML 中的 Transformable 和 Drawable

c++ - 我应该如何格式化我的 .dat 文件以便制作 3D vector 图?

c - 尝试从文件打印数据时出现段错误

c++ - gmtime算法的最小实现?

c - 将数组写入二进制文件?

c++ - sdl表面到opengl纹理

带接口(interface)指针的 Delphi 调试器功能

c++ - 如何定义指向 const 对象的可变指针?

c - Rust C 互操作段错误(斜线 STATUS_ACCESS_VIOLATION)