00:00
大家好,我们上次讲的这个缓冲区一出的这个。一些简单的知识啊。然后我们接着就是把上次的再完整的讲一下。这是我之前写的文章啊,这是我的公众号,然后这个是我公众号的二维码,前面的就是讲的这些是原理部分啊,呃,就是我们不去实际的在计算机上去,而是直接去。通过几道题吧。来来进行分享,然后这节课呢,我们来开始写这个代码,然后开始就是测试一下。呃,我使用的这个环境呢,是XP虚拟机啊。然后再加这个VC6,呃,为什么是使用这个VC6呢?现在VS的这个版本也都出的挺挺高了,也都挺新的,为什么用这么古老的VC6呢?呃,因为这个VC6它的内存就是看起来内存的比较简单啊,对于学习的话,其实也是比较方便的,就比如说我们学习汇编的时候,不管我们什么时候去学习汇编,我们都基本上是从。
01:20
8086开始学的对吧,然后学完8086呢,一般学的就是学保护模式这一块的话,都是从386开始学,这块是没办法就是跳过的,所以我们学这个的时候,就写这段代码的时候呢,也是通过这个VC6,因为它简单嘛。啊呃,上次呢,就是发了这个视频以后,然后我同学就我这个朋友的一些同学吧,就是也提出了一些问题,他们说他们没有这个编程的基础。啊,所以的话,我在这儿演示的时候呢,我本来想的是把代码写好,其实其实也已经写好了的,呃,但是就是说是。
02:05
不太不太懂这个代码,嗯,那我就从V161.1点的来演示啊。呃,首先呢,就是我打开我的这个VC6,然后新建新建一个WIN32控制台。然后在桌面上建一个文件夹吧。Sta。就叫sta吧嘛,对吧,然后呃,选择一个就是。Simple application确定。我们就建了一个这个C语言的。项目啊。然后呃,就这么简单。啊,然后把代码复制过来吧,我就不敲了,毕竟敲的话比较浪费时间。然后把这个头文件复制过来。
03:02
其实整个这样的代码已经完成了,和和我们这个题目中的是一样的。啊。定义了一个Apple,定义一个八分九,然后获取这个。标准从标准输入,也就是键盘当中获取输入,然后保存到这个buffer里边。啊,然后你看我们对这个Apple进行判断,是否是这个0X64636261对吧,如果相等的话,就输出这个。啊,程序是一模一样的,然后呢。呃,我们来进行一个编译啊,编译的话可以从菜单里面,也可以从工具栏啊,工具栏里就可以了,编译可以看到就是这个零错误有一个警告啊。这个警告呢,就是这个Apple这个局部变量没有被使用,就是初始化或者是使用啊。啊,这个不要紧,我们只关心有没有错。
04:02
他的警告呢?怎么忽略就可以了啊?嗯。虚拟机还是有点卡好,然后呢,我们在这个盖子这下。说实话,在虚拟机里操作也不怎么方便。把光标定位在这一行的时候,按一下F9,就是按下F9,它就会前面加一个红点,就是下段啊。下了段以后呢,然后我们就。来调试,调试的话我们按F5,就是让它跑起来。可以看到我们这有个黄色的箭头是吧,已经指到了这个。在这,然后我们来看一下。看一下我们的内存啊。呃,这有一个watch窗口,如果没有的话,大家可以从这个viewbug这或者是out加F3把这个watch打开,然后我们来看一下。
05:03
他的地址。对吧,这个是Apple的地址,我们这个Apple的地址是12F,和我们题目中的不一样。题目中给出的是12F44啊呃,这个地址呢,大家不要纠结。呃,不同的操作系统。然后就是它的地址不一样,更往往更具体的说,就是不同的操作系统,甚至是不同的补丁号。啊,它的地址都不一样,还有就是不同的这个编译编译器,甚至是不同的编译选项,最后这个地址可能都不同啊,我们这里使用的是XP,然后是VC6加一个第八个版本啊。好,我们可以看到我们的这个地址是Apple的地址是0012FF7C,按照我们上次减C的话,我们的这个buff的地址应该是零吧。
06:07
因为上次直接减的是C嘛,对吧。八分看是吧,七零。然后它是7C,我不知道大家还记不记得我们上次讲的这个了。呃,Apple的地址是448 uff分的地址是三八啊,中间正好也是这个,呃四四减C就正好等于三八啊,然后呃,我们呢,其实他们俩的离的是这个,呃C就是说这个C呢,是16制的C,其实转化成十进制呢,是12啊,然后我们把把这个。三。这个内存窗口里看一下也一样的吧,第八个watch里面有个memory,就是这个窗口,内存的窗口。啊,这个。
07:03
这一部分七零就是我们这个八分的这个地址啊,然后我们再让他单步走一步,单步的话是F10。啊,再再走一步,这就开始接受等待输入了,我们就是输入我们的这个123456789。十,11 12,然后输入abcd好回车。然后我们再回我们这个内存窗口看一眼啊,我们刚才是说了这个12F7098分的地址,对吧,然后它真正的空间是长度是九,这是四个,这是四个,然后到这是一个,这是它真正的这个。Buffer的空间啊,就是内存空间占空间对吧,然后后面三个是为了对齐。而产生的三个空间,然后对齐以后呢,我们的在这个位置,所以的话,我们输完这三个一以。
08:09
再往后的值就直接覆盖到Apple里了,对吧,可以看到变红的地方就是我们刚才改变的这个内存变量啊,但是为什么我们输入的是一,这显示的是31呢?原因就是说是我们的这个,呃,31啊,它这个是16进制的31就是这个我们刚才说的。一的阿克码,然后这个六一呢,对应的就是小写A的ask克码。啊,这是16进制显示的,这这是这个地址,就前面这一列是地址,中间这一部分是呃,这个内存的值,然后后面呢,是以这种字符形式显示的啊,所以的话,我们就从这就可以看出来。呃,我们是怎么样去覆盖和溢出的,对吧,所谓的溢出呢,其实就是越界了嘛,不该去。
09:03
赋值的内存去赋了值了,对吧,因为我们的这个盖茨并没有并没有做这种就是是否越界的一个检测,对不对,所以的话,这就相当于是移除了这还多一个零,是为什么呢?红颜色的改变了。原原因是因为啊,现在没颜色了,这个是因为我们字符串。就是C元的字符串是以杠零结束的啊,所以的话,它会默认的再给我们加一个零啊,其实对于我们来说,我们真正如果是八分九的话,我们的字符长度实际上应该是八个,因为第九个这个位置呢,会给一个零,这样的话就合适了,所以的话。大家可以看一下。因为它输入的就是12个1ABCD对吧,然后可以看到这个位置呢,正好就是64636261,为什么是反的呢?对吧,六一是A,六二是B,这是一个。
10:09
就是字节序的问题啊。呃,因为我记得在文章就是上节课里面说过啊,Apple的地址要比这个buffer的地址高,对吧,因为他们在这个站中从这也能看出是吧,7C肯定要比这个七零大吧。啊,所以的话,这其实就是我们调试的一个这个结果吧。比较比较直观,其实所以的话,呃。我们让程序暂时的运行一下。哦,一闪而过了啊。啊不要紧,我们直接我们直接运行1234567890C12ABCD回车看hello word输出出来了,对吧。然后后面这个呢,是是他为了就是能暂停一下,这并不是我家的啊。
11:06
就是直接在VC里面运行,它就会加这么一个东西,所以的话,其实呃,我们通过这种调试的方式。是可以直接去观察,是可以直接观察这个。不是,是可以直接观察内存的,我们再来观察一下吧。再来看最后一遍啊。这次我们换一个12345678。对吧,1234ABCD来回看一下是吧,313233343536373831323334,然后61626364对吧,所以的话这次的话还是相等的,Apple还是64636261啊这个是字节序的问题,这个字节序的问题呢啊,讲起来其实也不麻烦,但是。
12:06
怎么说呢,说了吧,我又怕就是整个问题就又被展开了啊大家。知道就可以了,所以的话,这么一条是也就清楚了啊呃,至于提的那几个问题呢,然后就是我看情况,如果可以的话,然后再录吧,本次内容呢,就到这里。呃,感谢大家,再见。
我来说两句