00:00
嗯,大家好,从这个视频开始,我会做至少两期关于CTF里的胖的视频,嗯,这期就主要讲一下环境准备与战役出的原理,然后后面的话应该会按照ctl wi的顺序来讲,OK,我们开始啊,首先环境的话是乌班图,是6.04的虚拟机啊,这个版本我看好像是可能有别的。题目的话会有一些其他的问题,反正我现在用这个是没有问题的,然后。泡套子这个裤,这个是用来写那个一批用到的。然后GDB以及它的插件,它插件的话,它是有有有不同的几个,然后我用的是这个,嗯,还有这个,那search这个是用来泄露那个那和版本的。
01:02
后面会用到,暂时也用不到,现在还有这个脚本,是蒸米的里面那个用来计算偏移的脚本,然后就开始讲原理吧。我先演示一下,当他去调用一个函数的时候,它是做了什么操作吧,就是OD,它是一个32位的动态调试工具,嗯,不了解没有关系,我简单介绍一下,这边是返回编。就是它一条一条的汇编指令,这边呢是寄存器,然后这边是占这个就是数据窗口一些数据,那主要关注这两个地方,现在嗯,首先在OD里面,它单步有两种方式,一种是F71种是F8,我说一下啊,我演示一下F8的话,这样单步走。
02:05
呃,这个地方我们不用管,然后如果遇到Co Co你可以理解为是一个函数,那它就会直接走过去,直接走完了,那对比一下,我们看一下F7是怎么做的,F7的话。他遇到函数以后,他会到函数里面去,再一步一步走,那真正的单步去执行那。好啊,我们来看看到这个函数啊,他想要调用这个函数,那他首先他要做的是把这个函数下一条地址,因为它执行完函数由它要返回吗?它返回到什么地方呢?就是它下面这条地址,它首先会把它压入到站里面。4E4F44,那我现在F7走一下,它会把它压到这里面,然后当这个函数执行完了。
03:01
它要返回的时候return啊,字面意思很好理解啊,返回的时候4E4F44,那它返回的就是目前这个地方占顶的这个地址,然后F8返回就回到这里了,那这这是没有什么问题的,对吧,但是如果你想一下。有一个程序它调用了一个函数,它让你在他调用那个函数呢,是让你书包里面输入数据的,如果你输的是正常还可以,如果你输多的话,他太多以后,他可能会把他的返回地址给覆盖掉。因为你输入的那个数据,它也是在站里面的嘛,如果你输的太多,它你往往下写,它会把可能把返回地址覆盖掉,你随便输的,当然它不可能是一个正,他很很小可能是一个正常地址,那他就会报错,但如果它正好是一个正常地址,它就会去那个返回到那个地址啊。
04:07
那样的话,如果你你你会构造,构造的话,那上面你写筛克的,下面你想筛克的地址,那这样的话,他返回的地址你写成12靠的地址,他就会回去执行你的是要考的,对吧,那针对这种东西它是有保护机制的,嗯,简单介绍一下吧,他这这一个是在你家里面在。函数开始执行的时候,先插上一个信息,然后当函数返回的时候,验证这个是不是给改掉了,如果改掉了的话,他就不让你去继续执行了,然后这一个是站上的,直接站上的数据执行没法做,就是说你因为你的筛后的写在站上的嘛,那站上的是不能去执行的,你写的就没什么用了。然后还有一种是系统层面的地址随机化。
05:06
嗯,这两种是在编译的时候是可以设置的,然后这个是在系统里面的那个设置,嗯,我们就跟着这个蒸米的第一个例子做个实验,好吧,呃,首先这是那个源码,我已经写好了,在这里,呃,我把之前编译好的删掉,我们跟着他来走一遍。这就是他的编译命令,首先这是编译乘32位,然后这两个分别就是说关掉前面那两个保护,嗯。这样的话就程序就可以执行了,你不用给你反映。那还有是说这个as lr要关掉,而且这个需要在root下去关掉它就是这样,OK,那就就这样,就全部那些保护给全关掉了,嗯,有有个命令叫做check SEC啊,可以用它来检测这个程序,看到什么保护我就不检测了,这就已经关掉了,没什么用,然后我们接下来要做的就是我们要知道它的站到底是多大,这样我们才能知道我们要写多少数据才能覆盖到它的返回地址嘛,对吧。
06:41
嗯,可以,就是用之前那个脚本了,嗯,再打开一个吧。这就是这不这个脚本在这儿吗?那他让他创造150个字符,然后这边的话用GDB这样,那调试让是让它运行,然后把这个东西输进去。
07:17
那不就出问题了对吧,那这是因为它返回的时候这个地址,它这是个你写入的这个地址是不是一个正常地址的,所以他会报就有问题,那你可以通过两点,就是看一下这个偏移嘛,把这个给切过去,这样他会告诉你啊。哦。这就是说他计算出来你这个占空间是140,这里是140,也就是说你要填到一百四以后再写的话,就是返回地址了,那你就知道应该写多少东西了,对吧,那知道他的占空间。
08:06
以后有多大以后我们写上地址,如果你是按这个方法写的话,你还需要知道什么,你要知道12课的地址对吧?嗯,你要知道让他跳到什么地方,他明显是要跳到这个站开始的这个位置啊那。这样的话有个问题什么呢?是啊,就是qui退出嘛,这个PD命令一个,嗯。我们看一下他写的这个。P啊。首先是是要靠的,这是它的配料的,就是它都都输了什么东西,首先是这个是要靠的,证明这一对,然后A有多少个A呢?是一百四减去一些罐的长度。很合理啊,嗯,就。找一下那个图,就这个,就是那个十克的,这是那一串A,然后就是课的地址。
09:05
你想要找到这个地址的话,呃,在用GDP调试的时候,它有个问题是,它可能会影响它它真正的位置,就是说GDP调试会影响这个在内存中的位置,虽然关闭了,但它还是会影响,所以这时候有个方法就是开启内存转储,用这个命令就可以。啊,不对啊,用这个命令我傻了。这样的话就开启了,然后当你去执行一个程序,如果这个程序报错的话,它就会在,如果你没有给它设置目录,它会默认在当前目录下生成那个一个core的文件,就这个,你再用GDP去调试这个文件,它就没有什么问题了,然后带上这个C。那这样就可以了哦,然后唱这样的话,就找到他那个折扣的开头的位置了。
10:14
这要在这里的,那为什么是144啊,我们首先我们的占空间是140,对吧,但你执行完啊,我我我再演示一下。你进这个函数,然后再返回的时候。现在这是那个那个。返回地址,然后你走一步你可以看到啊,算了,就这样,我我我用这个来介绍一下,比如说这。这是那个站,就是返回地址,就是现在他走的那个他的 ep123451234567,上面是七行,我们就不不说什么字节什么的,就按行吧,好吧,这个是七行的占空间,然后一个反馈地址是八行,然后现在你EP是在这,你想要知道它的首地址,你肯定要减的话,你要减去整个这一串,而不是简单单的这个站,对吧,那多出来的这一个返回地址,它是四字节的,所以是144。
11:36
就是一百四加上四就是144对吧,然后这样的话,就可以看到他的手机,它那个呃,那个那个是就是。站的那个,他他之前调用站的那个那个手机纸吧,是不是,然后你就可以。因为这个是之前的,可能有点问题啊,总之现在是这样,然后我们打开这个exp。
12:10
首先会把十要扣的写上,然后减去十要克的长度,就是填充那一堆A垃圾数据,然后再把返回地址填上去,返回地址就是这个地址。就是我们来试一下好吧,执行一下。这是攻击成功了,嗯。就就就就这么多。嗯,就这么多吧,然后后面的话,这些应该我记得在前面这个里面是都讲过他后面讲的这些东西的,所以就不按这个讲了,就按CDL里面这个背这个LP来讲了,好吧,嗯,再见。
我来说两句