|
主题 : : 实验八——个人分析 [已解决] |
回复[ 4次 ]
点击[ 611次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2011-02-14 09:59 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:2
注册日期:2011-02-09 21:07 |
assume cs:codesg
codesg segment
mov ax, 4c00h
int 21h
start: mov ax, 0
s: nop
nop
mov di, offset s
mov si, offset s2
mov ax, cs:[si]
mov cs:[di], ax
s0: jmp short s
s1: mov ax,0
int 21h
mov ax,0
s2: jmp short s1
nop
codesg ends
end start
如上的程序可以正确返回。
分析程序如下:
(1)
首先,
mov di, offset s
mov si, offset s2
mov ax, cs:[si]
mov cs:[di], ax
这四条指令的作用是将s2处的指令一条指令拷贝到s处。
(2)
我们就要分析这条拷贝的指令
jmp short s1 ;E8 F6
该指令为短转移,是根据位移进行转移的指令。
jmp short s1对应的机器码为E8F6,位移为F6(-10)。
在s2处,E8F6代表向前跳转到S1处。
当将E8F6拷贝到s处,向前跳转10个字节,即跳转到mov ax, 4c00h指令处。
(3)
完成指令拷贝后,
程序顺序执行到标号s0处,
然后跳转到s处,
然后继续跳转到
mov ax, 4c00h
int 21h
程序正确返回。 | | |
|
|
|
|
[第1楼]
[ 回复时间:2011-02-14 23:53 ]
[引用]
[回复]
[ top ] | |
荣誉值:93
信誉值:0
注册日期:2010-11-29 14:28 |
1.你写的挺好的.
2.
这四条指令的作用是将s2处的指令一条指令拷贝到s处
-> ;可以写的更详细些,呵呵
这四条指令的作用是将s2处的2个字节指令拷贝到s处
mov ax, cs:[si] =>ax=0xF6E8
mov cs:[di], ax =>s: db E8,0F6
而这2个字节从jmp short s1起始,jmp short s1编译后正好为2字节大小
所以是将s2处的指令一条指令拷贝到s处
e8是jmp short的指令码,同时jmp short的范围是一个有符号字节的大小
即[-128,127],所以可以判断f6是负数
求补可得到原码0x0A,负数说明ip逆向行走ip=ip-10
当指令执行到jmp short s1时,ip=$+2 ;$表示当前
也就是ip=mov di,offset s的地址,执行jmp时,ip=ip-10
通过计算或查指令手册可得
mov ax, 4c00h 到 mov di,offset s之间的偏移地址的差值恰好为0x0A
那么ip会回到mov ax,4c00h的偏移地址
整个过程中段地址没有发生变化. | | |
|
|
|
|
[第2楼]
[ 回复时间:2011-02-16 22:37 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:2
注册日期:2011-02-09 21:07 |
回复:[第1楼]
------------------
你描述的太详细了,呵呵。
这个题还有一点挺妙的,就是那个位移10,其实不需要知道具体位移长度为10。
标号s往前的三条指令为:
mov ax, 4c00h
int 21h
mov ax, 0
标号s2往前的三条指令为:
mov ax,0
int 21h
mov ax,0
对比一下,前后的三条指令的除了数值不全一样,指令是完全一样的,所以长度也都是一样的。
这样有,
从s2跳转到s1处MOV AX, 0的位移 = 从s处跳转到程序开始的mov ax, 4c00h的位移
由于jmp short指令记录的是位移,当jmp short s1指令拷贝到s处时,根据位移,就能转移到程序开始的
mov ax, 4c00h
int 21h | | |
|
|
|
|
[第3楼]
[ 回复时间:2011-02-16 22:45 ]
[引用]
[回复]
[ top ] | |
荣誉值:93
信誉值:0
注册日期:2010-11-29 14:28 |
描述的越详细,思考的也会越多,各种知识点的关联会越紧密,共同进步. | | |
|
|
|
|
[第4楼]
[ 回复时间:2011-02-16 23:57 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:2
注册日期:2011-02-09 21:07 |
此贴由 贴主 于 [ 2011-02-16 23:57 ] 结贴。 结贴原因:问题已解决 | | |
|