#include <stdio.h>
int main(int argc, char* argv[])
{
int a[4] = {1,2,3,4};
int *ptr1 = (int*)(&a+1);//4
int *ptr2 = (int*)((int)a+1);//20000000 把a强制变为整数+1
/*
00401000 /$ 83EC 10 sub esp,0x10
00401003 |. C74424 00 010>mov dword ptr ss:[esp],0x1
0040100B |. C74424 04 020>mov dword ptr ss:[esp+0x4],0x2
00401013 |. 8B4424 01 mov eax,dword ptr ss:[esp+0x1]
00401017 |. 6A 02 push 0x2
00401019 |. 50 push eax
0040101A |. 6A 04 push 0x4
0040101C |. 68 30704000 push xueAn.00407030 ; ASCII "%x--%x--%x
"
00401021 |. E8 0A000000 call xueAn.00401030
00401026 |. 33C0 xor eax,eax
00401028 |. 83C4 20 add esp,0x20
0040102B \. C3 retn
dd esp
0018FF38 00000800
0018FF3C 00000001
0018FF40 00000002
0018FF44 00401B9C 返回到 xueAn.00401B9C 来自 xueAn.00401C5B
0018FF48 00407000 xueAn.00407000
dd esp+1
0018FF35 0000401A
0018FF39 01000008
0018FF3D 02000000
0018FF41 9C000000
0018FF45 0000401B
*/
int *ptr3 = (int*)(a+1);//2
/*x86下 4---20000000---2 原因在于小端存储 ptr2指向了数组第二项“末尾”这个“末尾”不是真的末尾是真正意义上第二项开始地址,但由于是小端存储,先把2塞到了真正意义上的开始地址(想象下OD数据窗口)
于是就变成了02000000然后就会输出2000000
/*
内存分布如下
0x0001 --------0x0002---------0x0003-----------0x0004
01000000 02000000 03000000 04000000
*/
printf("%x--%x--%x\n",ptr1[-1],*ptr2,*ptr3 );
return 0;
}
取数组地址引发的血案(int*)(&a+1);(int*)((int)a+1);
最新推荐文章于 2020-07-06 20:40:05 发布