博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【实战编程】编写0号中断处理程序
阅读量:5098 次
发布时间:2019-06-13

本文共 1854 字,大约阅读时间需要 6 分钟。

题目:编写0号中断处理程序,在除法溢出时,在屏幕中间显示字符串“hacker by admin!”

 

之前先补充一个rep movsb的指令知识

movsb和movsw是相反的,都是根据标志寄存器DF的值选择正向传递还是反向传递。

这两个指令都是把ds:si中的值传递到es:di的位置中去

如果df=0时,取正向移动。(inc si和di)

如果df=1时,取反向移动。(dec si和di)

由上可知,只需要改变si和di的值就可以选择正向还是反向

cld 指令 :使df=0;std 指令 :使df=1.

注:使用movsb或movsw时  正确时候操作是:rep movsb

 

下面开始正式编程

assume cs:code data segmentdb 'hacker by admin!'data endscode segmentstart:mov ax,csmov ds,axmov si,offset domov ax,0mov es,axmov di,200hmov cx,offset doend - offset do                        ;获取中断程序的长度,好进行复制cldrep movsbmov word ptr es:[0],200hmov word ptr es:[2],0hmov dx,0ffffhmov bx,1div bx        ;测试除法溢出的代码mov ax,4c00hint 21hdo: mov ax,datamov ds,axmov si,0hmov ax,0b800hmov es,axmov di,0mov cx,16s:mov ah,2    ;绿色字体mov al,ds:[si]mov es:[di],axinc siinc diinc diloop smov ax,4c00hint 21hdoend:nopcode endsend start

 上述代码写完后,可以执行看看

可以说是成功编写完毕了。

但这里其实还有个小毛病不知道各位有没有发现

我的data段数据是放在do子程序的外面!!!

懂8086机制的同学们就知道,每一次程序开启,所分配的空间都是系统自己给我们的,也就是说

在程序运行期间,data段的数据是存在的。

一旦程序退出了,原本存放在内存中的data数据就立马会被其他的程序数据覆盖掉!!

经更改后代码如下:

assume cs:codecode segmentstart:mov ax,csmov ds,axmov si,offset domov ax,0mov es,axmov di,200hmov cx,offset doend - offset docldrep movsbmov word ptr es:[0],200hmov word ptr es:[2],0h;mov dx,0ffffh;mov bx,1;div bxmov ax,4c00hint 21hdo:jmp short dostartdb 'hacker by admin!'   ;我们将data中的数据放带do子程序里来dostart: mov ax,0mov ds,axmov si,202hmov ax,0b800hmov es,axmov di,160*8+80    ;取屏幕中间部分mov cx,16s:mov ah,2mov al,ds:[si]mov es:[di],axinc siinc diinc diloop smov ax,4c00hint 21hdoend:nopcode endsend start

将data中的数据放在子程序里来,可以看到,在数据的前面有一个jmp指令

用来跳转到我们真正的中断程序中!

在8086汇编中  jmp指令占用2个字节空间,所以我们的si将会在202H处开始复制数据到显示屏中

下图是我安装好程序,再去用debug查看0:0200内存区域 代码还是在那里【因为其他合法的程序一般都不会使用 0:200~0:2FF( 0:200h~0:2FFh)的 256个字节的空间】

接下来用debug的a指令让程序手动溢出试试

mov dx,0ffffhmov bx,1div bx

所以说,只要运行一遍这个程序,在之后无论什么时候出现除法溢出都会成功显示该字符串。

转载于:https://www.cnblogs.com/wh4am1/p/7501389.html

你可能感兴趣的文章
面向对象进阶
查看>>
Android studio gradle配置完整版(转)
查看>>
Pair Project 初体验(By Cuilin Lan & Xiao Fang)
查看>>
IOS使用mkdir创建目录
查看>>
冒泡排序实例
查看>>
my code review
查看>>
Linux下环境变量配置方法梳理(.bash_profile和.bashrc的区别)
查看>>
[Luogu1216][USACO1.5]数字三角形 Number Triangles
查看>>
张云飞 201771010143 《面对对象程序设计(java)》第十四周学习总结 第十三组
查看>>
2019 蓝桥杯省赛 A 组模拟赛(一)-忽明忽暗
查看>>
mysql数据库中导入txt文本数据的方法
查看>>
JavaScriptSerializer的实现-常用JsonHelper类
查看>>
Mahout0.9的安装与测试
查看>>
DropDownList在GridView编辑时设置默认选项
查看>>
function pointer demo in C language
查看>>
JavaScript小笔记
查看>>
文章翻页英文单词分割问题解决方案
查看>>
201_Qt5.3.2Code
查看>>
ScriptableObject 对象化的运用
查看>>
scrapy中cookie处理
查看>>