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

时间:2014-09-07 08:17:00

标签: 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。 但第二个代码实际上做了什么?

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

你介意通过一篇文章或书籍或......来向我提供这个问题的概念吗? 我想学习这个来自己理解和写这样的东西。

非常感谢你。

1 个答案:

答案 0 :(得分:2)

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

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