首页
社区
课程
招聘
[讨论][求助]一个整数溢出的问题
发表于: 2008-10-22 16:18 3128

[讨论][求助]一个整数溢出的问题

2008-10-22 16:18
3128
77F5BC38 mov eax, [ebx] ; length field
77F5BC3A lea eax, [eax+eax+2] ; *** integer overflow ***
77F5BC3E push eax
77F5BC3F push edi
77F5BC40 call ds:LocalAlloc
上面一段代码是从一个有问题的程序中逆向得到的。
eax应该是长度吧。假设为10,那[eax+eax+2]岂不是[0x00000022]?
就算eax比10大,[eax+eax+2]也是一个很低的地址,肯定不是在程序的内存空间里面,那去这里取值干嘛?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 293
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
lea eax, [eax+eax+2]
执行完了,按你的说法eax里面就是0x00000022,不是去[0x00000022]里面取值。
2008-10-22 16:45
0
雪    币: 230
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
就如上面 icersg 说的
lea eax, [eax+eax+2]
实际上是 eax=eax+eax+2  =>   eax=2*eax+2
如果结果超出 eax 的范围,可以用乘法来完成.

LocalAlloc 只能申请4G的内存,如果需要4G以上的内存可以考虑用内存映射文件
还有确认是否需要4G 以上的内存,还是
77F5BC38 mov eax, [ebx]  ;这个[ebx] 的值记算错误 .
2008-10-23 11:38
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
哈哈,谢谢两位兄弟。明白了
2008-10-24 10:40
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
5
lea指令是编译器用来计算某些算术表达式的,得到的结果不是用来当指针的。
一般,当乘数是2的幂时,编译器会用移位指令,
而有些数乘如乘以5,乘以3,编译器会用这样的指令,lea eax, [eax+4*eax], lea eax,[eax+2*eax]来实现,这样比乘法指令要更好一些。

而你给的这个,就是计算 eax *2 + 2 这个表达式的。
2008-10-24 13:13
0
游客
登录 | 注册 方可回帖
返回
//