由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。
话说回来,到底是不是这样。等我学完了再说吧!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· 地球OL攻略 —— 某应届生求职总结