王爽《汇编语言》实验8:分析一个奇怪的程序

本文详细分析了一个使用汇编语言编写的程序,解释了其执行过程。程序通过移动和覆盖指令,使得原本的NOP指令被替换为跳转指令,导致执行流程发生改变。最终,程序跳转回起始位置执行退出操作。
摘要由CSDN通过智能技术生成
;分析下面的程序,在运行前仔细思考:这个程序可以正确的返回马?运行后在思考:为什么是这样的结果?
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处,dubug 命令jmp short s1,共占两个字节,恰好占据原本2个nop的内存空间(nop指令占据一个字节)


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,也就是返回操作。



;AX=0000  B

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值