【问题标题】:Advanced pointer typecasting in C/C++ [closed]C/C++ 中的高级指针类型转换 [关闭]
【发布时间】:2014-09-07 08:17:00
【问题描述】:

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

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

 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。 但是第二个代码实际上是做什么的?

我知道这可能不是一个好问题,但我想知道如何深入了解指针及其类型转换。

您是否介意通过文章或书籍或...给我这个问题的概念。 我想学这个来自己理解和写这样的东西。

非常感谢。

【问题讨论】:

  • 你的第一段代码肯定不会编译。 Second 可以编译,但不会在任何最近的系统上运行。
  • 请确保复制/粘贴代码 sn-p 而不是手动输入,否则您的问题将无效。
  • 很抱歉,但我只是想知道是否有任何文章或书籍来解释 C 中的高级类型转换?这是我的全部问题:)
  • @user3679015 检查c++ tag wiki。有一整套书籍和链接。
  • 在我看来,您遇到了一些漏洞利用代码或其他可爱的诡计,并试图弄清楚它是如何做到的。如果您想要一个明智的答案,一些上下文会有所帮助。否则会被关闭。

标签: c++ c pointers assembly casting


【解决方案1】:

内存只包含数据字节。如何解释这些数据取决于您。

您的缓冲区可能被解释为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() 的函数的指针,然后执行它。

【讨论】:

  • 很好的答案!非常感谢!)
猜你喜欢
  • 1970-01-01
  • 2016-12-14
  • 2015-01-19
  • 2018-09-21
  • 1970-01-01
  • 2020-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多