由MOV SS,AX 产生的联想

    前些天在学汇编,速度很快,看得不是很仔细。所以决定再次温习一次。无意中看到了书中对 MOV SS,AX这条指令的解释。

          源代码我就不全部贴出来了,说关键地方。

          mov ax,200

          mov ss,ax

          mov sp,10

          push ax

          无疑,代码很简单,意思也很简单。就是指点栈顶,然后入栈。在DEBUG下执行的时候,发现。用T命令执行到 MOV SS,AX的时候,下一条指令却不是 MOV SP,10 而是 push ax 。为什么呢?

        看完解释之后发现。当改变堆栈段地址寄存器的值的时候。也就是SS,下一条指令被无条件执行了。原因不清楚,书上说要等到学习到中断了之后才解释,现在我开始联想。

        如果说一个程序在执行的时候,也就是被装入内存。每条执行都对应一个内存地址。然而这个内存地址里面无疑放的是这条指令的机器码,比如 MOV SS,AX 的机器码为 00 BA CF (假设)。那么接下来的指令,不管是什么。都会被执行。

        如果我通过某种手段修改了 00 BA CF 之后的机器码,里面写的是一条跳转指令。跳转到一段非法程序,如 JMP 500:FC 假如这个地址是一个非法程序的起始地址。当然,前提是让这段非法代码常驻内存。这样这段代码就被执行了。试想,我仅仅需要做的是,修改一小段内存地址的值。却可以做非法操作,这让我们的病毒程序再次被缩小,也许只要1k就可以了。(我之前写的汇编程序,做了个乘法运算,代码还有点长,也没到1k,这里仅仅需要修改内存,代码更短)。说的夸张点,完全可以利用这点做到溢出,得到shell。

         话说回来,到底是不是这样。等我学完了再说吧!

原文地址:https://www.cnblogs.com/LearningC/p/1894663.html