首页
社区
课程
招聘
[讨论]double类型逆向示范
发表于: 2012-7-5 15:59 9540

[讨论]double类型逆向示范

2012-7-5 15:59
9540
书上以float为例对浮点数的逆向进行了讲解,没有示范double类型的逆向,但可以类比。建议先自己动手尝试一下再阅读本文。
看代码:
9:        double fDouble = 15.5;  
00410958   mov         dword ptr [ebp-8],0  
0041095F   mov         dword ptr [ebp-4],402F0000h 


402F0000用计算器转为二进制为1000000001011110000000000000000,注意计算器可能忽略了前面的0,所以你需要检查结果是不是32位,这里少了首位0,加上之后为:
01000000001011110000000000000000
根据mov         dword ptr [ebp-8],0,得到补上末尾的32位为:
0100000000101111000000000000000000000000000000000000000000000000
开始分析:
第一位符号位:0
之后的十一位为指数位:10000000010,减去1023后得3
剩余为尾数位:1111000000000000000000000000000000000000000000000000
把尾数位补上1,小数点点在后面:
1.1111000000000000000000000000000000000000000000000000
小数点根据指数位,向后移动:
1111.1000000000000000000000000000000000000000000000000
还原成了二进制小数,这里有一篇不错的文章详述了十进制数与二进制数的互转,如果你不熟悉,可以参考:d6aK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3S2A6i4K6u0W2j5X3q4A6k6s2g2Q4x3X3g2U0L8$3#2Q4x3V1k6U0N6s2A6Z5K9h3c8S2L8#2)9J5c8X3W2@1k6h3#2Q4x3V1k6U0k6U0f1K6z5r3b7@1x3$3j5@1y4o6S2U0y4e0q4W2z5o6R3$3k6o6p5H3k6U0R3`.
这里给出转为十进制后的结果:
整数位:
1+2+4+8=15
小数位:
(2^-1)*1=0.5
结果:15+0.5=15.5
完毕
需要注意的是,由于入栈时栈顶是从高地址向低地址增长的,所以这种情况要把第一个push后面的操作数放到前面:
9:        printf("%.1f\n", 8.0/5.0);  
00410958   push        3FF99999h  
0041095D   push        9999999Ah  

练习:把以下汇编代码逆向为C代码:
00401028   push        40080000h
0040102D   push        0
0040102F   call        _sqrt (00401124)
00401034   add         esp,8
00401037   fadd        st(0),st
00401039   fdiv        qword ptr [__real@8@40019cccccccccccd000 (00428038)]
0040103F   fadd        qword ptr [__real@8@3fff8000000000000000 (00428028)]
00401045   sub         esp,8
00401048   fstp        qword ptr [esp]
0040104B   push        offset string "%.8f\n" (0042801c)
00401050   call        printf (00401090)
00401055   add         esp,0Ch

附:
00428038  9A 99 99 99 99 99 13 40
00428028  00 00 00 00 00 00 F0 3F

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

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 31
活跃值: (53)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
不错的说,可以更加详细些。
2012-7-5 17:41
0
雪    币: 9
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
学到了
2012-7-5 18:01
0
雪    币: 270
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
4
有点意思  。。小数换算部分可否详细些?
2012-7-5 19:36
0
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
谢谢。
改了一下,详细一些了,如果还感觉不详细可以再和我说声。
2012-7-5 20:48
0
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
谢谢。加了一篇相关文章链接,可以参考。
2012-7-5 20:48
0
雪    币: 211
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
呵呵,分析的透彻
2012-7-6 08:33
0
雪    币: 182
活跃值: (843)
能力值: ( LV10,RANK:173 )
在线值:
发帖
回帖
粉丝
8
练习:printf("%.8f\n",2*sqrt(3)/4.9+1.0);
2014-7-21 10:24
0
游客
登录 | 注册 方可回帖
返回