我已经搜遍了所有的网,但我找不到任何东西。
我想知道当你输入时它是如何有意义的:
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。 但第二个代码实际上做了什么?
我知道也许这不是一个好问题,但我想知道如何深入了解指针及其类型转换。
你介意通过一篇文章或书籍或......来向我提供这个问题的概念吗? 我想学习这个来自己理解和写这样的东西。
非常感谢你。
答案 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()
的函数的指针,然后执行它。