| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3684 人关注过本帖
标题:MOV 指令的问题
只看楼主 加入收藏
wfoo
Rank: 3Rank: 3
等 级:论坛游侠
威 望:7
帖 子:120
专家分:134
注 册:2011-8-6
结帖率:66.67%
收藏
已结贴  问题点数:20 回复次数:8 
MOV 指令的问题
这个是IDA反汇编出来的代码:
.text:FFFFFFFF8020014A 48 8B 25 3F 00 00 00                    mov     rsp, cs:off_FFFFFFFF80200190
.text:FFFFFFFF80200151 6A 00                                   push    0
.text:FFFFFFFF80200153 9D                                      popfq
.text:FFFFFFFF80200154 0F 01 15 A5 AE 3D 00                    lgdt    fword ptr cs:unk_FFFFFFFF805DB000
.text:FFFFFFFF8020015B B8 18 00 00 00                          mov     eax, 18h

这是Intel® 64 and IA-32 Architectures Software Developer’s Manual的指令说明:
Opcode     Instruction        Op/En    64-Bit mode   Compat/Leg Mode       Description
8B /r         MOV r16,r/m16        RM        Valid         Valid                 Move r/m16 to r16.
8B /r         MOV r32,r/m32        RM        Valid         Valid                 Move r/m32 to r32.
0F 01 /2      LGDT m16&32          M         N.E.          Valid                 Load m into GDTR.
0F 01 /2      LGDT m16&64          M         Valid         N.E.                  Load m into GDTR.

目标代码为64位,Manual说明MOV(8B)指令是把r/m32的数MOV到r32寄存器中,为什么IDA反出来的汇编却是相对地址呢(0xFFFFFFFF80200151 + 0x0000003F = 0xFFFFFFFF80200190)?
那个lgdt指令也是这样?

[ 本帖最后由 wfoo 于 2014-9-26 09:56 编辑 ]
2014-09-26 09:54
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:7 
我在想 你确定这是一段代码而不是数据么
2014-09-26 10:28
wfoo
Rank: 3Rank: 3
等 级:论坛游侠
威 望:7
帖 子:120
专家分:134
注 册:2011-8-6
收藏
得分:0 
确定是代码
2014-09-26 10:35
wfoo
Rank: 3Rank: 3
等 级:论坛游侠
威 望:7
帖 子:120
专家分:134
注 册:2011-8-6
收藏
得分:0 
那段代码是linux刚被解压,然后就掉到那里执行,前面可能还有30多条指令。
2014-09-26 10:37
wfoo
Rank: 3Rank: 3
等 级:论坛游侠
威 望:7
帖 子:120
专家分:134
注 册:2011-8-6
收藏
得分:0 
unk_FFFFFFFF805DB000这个地址上的数据也是符合GDT需要的数据格式。
2014-09-26 10:43
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11771
专家分:43421
注 册:2006-5-13
收藏
得分:7 
某些数据段也有可能恰好能被反汇编成伪代码的,首先必须确定要反汇编的确实是指令段且未被加密过。

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2014-09-28 07:59
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:7 
不懂呀

DO IT YOURSELF !
2014-09-29 08:16
wfoo
Rank: 3Rank: 3
等 级:论坛游侠
威 望:7
帖 子:120
专家分:134
注 册:2011-8-6
收藏
得分:0 
回复 6 楼 hu9jj
那段数据我可以肯定是代码,从linux的镜像第一条代码我一直分析到了那里。那段代码是真正开始运行elf格式的内核代码了,也就是刚刚开始把cpu设置为保护模式并开启64位模式,然后就是那段代码初始化堆栈,清零rflags寄存器,设置全局描述符表,初始化内存分页所需要的目录表项。也就是把释放的elf代码映射到虚拟地址FFFFFFFF80000000.
2014-09-30 00:25
wfoo
Rank: 3Rank: 3
等 级:论坛游侠
威 望:7
帖 子:120
专家分:134
注 册:2011-8-6
收藏
得分:0 
后来查资料我也把问题弄明白了,64位的r/m操作数有点特别,当mod为0x4(对应的寄存器是rsp)的时候,基址寄存器为rip,也就是这样刚好为相对地址。
2014-09-30 00:30
快速回复:MOV 指令的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015545 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved