取数组地址引发的血案(int*)(&a+1);(int*)((int)a+1);

17 篇文章 0 订阅
#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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值