assume cs:code
code segment
start: mov ax , cs
mov ds , ax
mov si , offset do0 ; 设置偏移到do0
mov ax , 0
mov es , ax
mov di , 200h
mov cx , offset do0end-offset do0 ; masm 支持运算
cld
rep movsb
mov ax , 0
mov es , ax
mov word ptr es:[0*4] , 200h
mov word ptr es:[0*4+2] , 0
mov ax , 1000h ; 为了让编译生成后的exe执行的时候打印出来中断程序要显示的提示字符串,这里加上这段代码;
mov bl , 1h ; 这段代码执行后产生溢出
div bl
mov ax , 4c00h
int 21h
do0: jmp short do0beg ; jmp 指令占两个字节
db "overflow!" ; 待0号中断执行时要显示的字符串,也可以用 db 'overflow!'
do0beg: mov ax , cs ; do0 这段代码放到0:200,当执行0号中断程序的时候 CS:IP 指向 0:200 ,CS=0,所以这里可以直接设置为 mov ax , 0
mov ds , ax
mov si , 202h ; 设置 ds:si 指向字符串,jmp指令两个字节,所以是202
mov ax , 0b800h
mov es , ax
mov di , 12*160+35*2 ; 设置 es:di 指向显存空间的中间位置(160-9*2 得到空闲的字符,除以二就)
mov cx , 9
s: mov al , [si]
mov es:[di] , al
mov byte ptr es:[di+1] , 2 ; 设置要显示的字符串的颜色
inc si
add di , 2
loop s
mov ax , 4c00h
int 21h
do0end: nop
code ends
end start
|
//debug单步调试,输出字符串一个一个显示
//直接运行int.exe结果一样 //没有写溢出操作代码,单步调试,人为的-a命令输入让程序溢出的代码
mov cx , 0
s: mov cl , [si]
jcxz ok
mov es:[di] , cl
mov byte ptr es:[di+1] , 2
inc si
add di , 2
jmp short s
ok: mov ax , 4c00h
int 21h
|
一点点微小的改动 |