00:00
大家好,今天我们来看这个,那它是在VK上是占役出最后一部分啊,然后前面有两个站迁移的这个介绍,那之前视频我们也说过站迁移了,就直接来看这里了。他的话是说,程序有了这个can保护之后,如果我们输入的内容覆盖掉了这个can,那它就会报错,然后程序会去执行这个函数,它的作用就是打印出这个arj为零指针所指向的那个字符串,那正常情况下它指向的就是我们的程序的名字,但如果我们能够利用战役出来控制这个东西的话,那我们就可以让它来打印出我们想要的东西,比如说flag,我们看一个例题。这个题目可以在这个地方发现,直接去找这个题就可以了,然后的话我们用IDA打开看一下。
01:02
嗯。可以看到他有两次接收我们的内容,然后但第二次输入的内容的话,他会把这个地方给改掉,我们看一下这个地方实际上是什么。嗯。可以看到这个600D20,它内容就是服务器上那个flag的内容。也就是说,如果我们能够把那个arg为零,它指向的那个地方改成这里的话。那我们就可以让这个这个函数把我们的flag给打印出来,但有个问题是你们可以看到它是会覆盖掉的,我们输第二次输入的时候,那即使你第二次你不输入,它也会通过下面这个函数来把这个地方的内容给覆盖掉。所以。
02:13
这个地方就没没办法去通过他来拿到了,但。还有一个EF文件映射,它是从零叉40000开始的,也就是说我们的flag在内存里面会出现两次,一次就是我们刚才找到的600D20,还有一次是400D20,即使是说我们的600D20被覆盖掉了,但是我们去400D20找就可以了,那现在我们就需要确定一下AG为零,它在什么地方,然后我们需要输入多少能把它给改掉,对吧?那我们直接GDB看一下。嗯。
03:06
我们在那个第一次输入的地方,给他下个断点。在这,然后运行一下。因为我们可以看到它上面,它会把RP给放到rdi里面,然后去调用这个,那64位的话,我们知道它的第一个参数是rdi的,所以我们输入的内容实际上是放在RP。的,那这样的话,只要我们找到那个AR减为零,然后用占RP和它的偏移去算一下的话,我们就知道应该填多少内容了,嗯,然后。就是这里介绍这种方法不太好用,我们直接用这个就可以找出来了。
04:01
那这样就拿到这个AJ为零这个东西的那个地址了,然后的话,我们用这个地址减去RP。这样拿到的这个零叉218就是A减为零相对于我们输入的那个地方的偏移,也就是说当我们输入了零叉218以后,我们输入零叉218的内容以后,我们再去写的话,就可以达到我们想要的目的了,就是说把那个arg为零的给覆盖掉了,那一叉P就这样了。A个呃,零叉218个A,然后再填上这个400第二零,然后就可以拿到我们的flag,然后我们再来看另一个例子。
05:01
王顶杯的一个体。这个题目的话,还是通过这种方法来找到我们的那个解为零,然后呢,我们可以看汇编的话,会发现它实际上输入的时候是从RBP减零叉四零开始的,也就是说我们再去算那个我们输入的地方距离这个压为零的偏移,偏移的时候我们用那个RVP减零叉四零来跟他算,那算出来以后得到的是零叉128,也就是说哦,当我们输入内容。输入零叉128以后再去写的话,就写到这个G为零的这个地方了,那还有一个我们。这一个我没有没有具体的那个flag的地址啊,我们只能通过相对的偏移来算一下,那有一种方法就是通过这个东西来算,可以直接在GDP里面把这个东西给打出来啊,用print,然后的话我们再找一下flag的位置,那这样它两个一减的话,我们就知道flag距离这个东西它有多远了,就是零叉168算的,那通过这种方法的话。
06:14
我们就可以去把flag的地址给写到这个ARGV0这个地方了,因为它这个程序它是三,当时是三次输入对。那这是本地打的,就本地当时一切都顺利,然后去当这个,因为这个题BU上是有的,然后我就想去试一下,结果试了很多个遗产P,始终是不行,然后后来去测试了一下,就他不管你输什么,它都是一个or no,就很奇怪,然后我在自己服务器上拉了一个就可以打得通了,就这个地址,大家可以去试一下。嗯,来看一下P啊,首先是296,也就是那个。
07:02
这个这个。零叉128它的那个值啊,然后我们把负次的got表,那就是我们想要通第一次我们泄露出put的那个地址,然后去用那个LA的基址来去计算这个这个东西。看一下他的地址,然后再通过这个地址的。0X168的偏移来拿到这个flag的地址。就这么个思。嗯,其实就就这么个思路,也不用多说了,我们来看别的吧,看这一个。这种方法主要是在开启as lr之后,那我们在第12位的间内偏移是不会改变的,也就是说如果我们能够改变低几位,然后就可以在一定程度上去控制程序的流程,那我们用IDA打开以后,发现它的在0A3E这个地方是有一个后门的,如果我们能够控制它来到这个地方,是直接能够去执行这样的一个函数的。
08:07
然后我们的程序有两次read,我们打算通过第一次read来泄露这个can的内容,第二次的时候带上这个can,然后把这个返回地址改成这里,那我们就可以直接get到shell了。嗯,我们通可以通过print f这个函数来把我们的can给打印出来,就是说在第一次read的时候,因为我们输入,我们输入的时候是。输入30个嘛,对吧,然后。其中减八是减的那个EBP啊RBP,然后加上个一,是为了把凯瑞的末尾给它改成一个非零的,这样的话print f它就不会结束,而直接把这个can给打印出来了。那打印出来之后,我们拿到以后,对吧,那我们在第二次去发送的时候加上这个东西。
09:06
然后这是EP。嗯,然后这里就是那个。要改的那个地址了,这样的话经过几次尝试是可以拿到下的。
我来说两句