电话
13363039260
是时候关注我们一波了<微信公众号渗透云笔记>
包含多个段的程序
前面说道,如果要使用安全的内存空间,0:200~0:2FF是相对安全得内存空间,可是这段空间只有256字节,如果需要的空间大于256字节该怎么办呢?
在操作系统允许的情况下,程序可以取得任意容量的空间。
取得空间的方法有两种。
若要一个程序在加载时取得所需的空间,则必须在源程序做出说明。
上面是从内存空间获取的角度上,谈定义段的问题。为了可读性、功能设计,一般一额定义不同的段来存放。
关于段的问题,我们将以这样的顺序讨论多个段的问题:
在代码段中使用数据
我们可以在程序中,定义我们希望处理的数据,数据作为程序的一部分一同被编译、链接写到可执行文件中。
考虑这样一个问题,编程计算8个数据的和,结果存放在AX寄存器中,下面是用我们前面知识写出的代码。
这里出现了一个新的指令dw,dw即“define word”,在这里,定义了8个字型数据,占用16字节的内存空间。
使用Debug调试程序,不运行,发现一个问题,程序所在的内存区为075C:0(DS=075C),前256字节存放着PSP,程序的存放位置应为076C:0,使用U指令查看确发现有点不对。
实际上,看到其实是有dw定义的数据,从第16字节开始才是汇编指令对应的机器码。
怎样执行程序中的指令呢?在Debug中,可以手动修改IP寄存器的值,从而使CS:IP指向程序的另一条指令。
这样一来,在系统运行时就会出现问题,程序的入口不是我们希望执行的指令。
借助伪指令可以通知编译器程序的入口。
有了这个指令,可以仿照这个模板写出更多的程序,start上面安排数据,start和end start之间安排代码。
在代码段中使用栈
这里的检测点没做出来,看视频才想通的,后来发现这个题目第一眼没看懂。
检测点考察dw定义的数据在内存空间的位置,理解了这一点,题目就可以做出来了。
注释未知的指令,在debug模式中运行可以直观的感受到到这一点。
将数据、代码、栈放入不同的段
前面的内容中,我们将数据、栈和代码都放到了一个段里面,编程的时候需要注意何处是数据,何处是栈,何处是代码。显然这样有问题:
下面的程序用不同的段实现了上面的功能
编写、调试具有多个段的程序
这里是两个检测点,为了理解不同段在内存空间中的排列,一个段在内存空间中最小单位为16字节。
限于篇幅原因,我这里介绍比较最后的一个实验。
程序如下,编写code段的代码,用push指令将a段中的前8个字型数据逆序存储在b段中。
写出程序很容易,不过这不是我要说的重点。