|
主题 : : 实验8程序分析 [待解决] |
回复[ 92次 ]
点击[ 5082次 ] | |
|
|
|
|
[帖 主] [ 发表时间:2007-06-27 15:11 ] | |
荣誉值:0
信誉值:0
注册日期:2007-06-26 14:20 |
实验8程序分析
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
执行流程:
程序从start处 mov ax,0开始执行,执行到mov cs:[di],ax,就把s2:处jmp short s1拷贝到s处,即覆盖2个nop(正好2个字节)
jmp short s1 在s2处,可以计算一下需要往上编译10个字节(3(jmp short s1)+3*2(mov ax,0)+2(int 21H)),
debug可以看到机器码为ebf6,f6是补码,转换一下即10,也即是向上偏移10个字节,这样的话s:处的2个nop的代码修改成
ebf6。
程序接着往下运行,跑到s0:jmp short s,这样又s:处,执行EBF6,即往上偏移10字节,计算一下就知道,ip这个时候指向0,
跑到codesg段开始处,即执行mov ax,4c00H;int 21H | | |
|
|
|
|
[第44楼] [ 回复时间:2010-03-23 16:56 ] | |
荣誉值:0
信誉值:0
注册日期:2010-01-20 21:20 |
有一点想不通,那41楼的来说
0B62:0016 EBF0 JMP 0008
FO的补码是10H,就是向上数16位到0B62:0008
可是0016-0008=E,E=14
还差了2个。
如果8,9,A,B,C,D,E,F,10,11,12,13,14,15,16数也只有15个。还有一个跑哪去了! | | |
|