zoukankan      html  css  js  c++  java
  • 由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。

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

  • 相关阅读:
    CentOS6.2编译安装Nginx1.2.0
    mysql之主从复制篇
    CentOS6.2编译安装PHP5.4.0
    c# 多线程 编程
    QQ空间及邮箱验证码登录的校验方式及自动登录的解决方案
    C# 动态编译、动态执行、动态调试
    在Visual C#中用ListView显示数据记录
    推荐一个免费的HTTP抓包分析工具 Fiddler Web Debugger
    C#简繁体转换方法(Microsoft.Office.Interop.Word)
    C#读取字符串类型XML
  • 原文地址:https://www.cnblogs.com/LearningC/p/1894663.html
Copyright © 2011-2022 走看看