正在加载……
专注、离线、切勿分心
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
一点点微小的改动







posted on 2017-09-14 19:34  正在加载……  阅读(494)  评论(0编辑  收藏  举报