00:00
大家好,今天我们看BP,嗯,在这之前先对与探图CSU做一下补充,因为当时不管是我学的时候还是录视频的时候,用的都是证明打包好的那个例子,他反回编出来的时候是这样一堆Mo,但是我自己去编译一下,然后。它的结果是有些差别的,是一堆泡泡,然后Vicky和其他网上的一些文章也是这样的一个结果。嗯,这两个传参有些区别,就单独说一下。这个表是当时录return to csu的时候做的一个表,因为这里有个调用,刚才一嘛,对吧,那它调用的时候,它的站已经到了,站点已经到这了,也就是说RRSP是在这了,RP已经加八了,然后他再去把RP加八的内容给RBX,实际上是在加十,16这个地方了,对吧,所以它需要有一个。
01:03
多余的参数来占控,但是如果是一堆泡泡的话。你去调用,然后RP加八,实际上站点在这那pop泡它是把站点的值给这个存器RBX,所以它不需要多填一个参数来占控,就这样一直填下来就可以了,嗯,然后这是一个点,还有一个是可以看到。这个地方它是十五十四十三,而泡泡的话是十三十四十五是这样的。所以你要有两个地方的参数是要换一下顺序的啊,其他的就没有什么影响了,对,那我们来看BP。BP是在没有给你提供二进制文件的情况下,你只能去通过不断的尝试来确定,就跟web里面的王柱差不多,嗯,那它有一个攻击条件是。
02:05
当程序崩溃以后,它是可以重启的,而且重启之后的地址要跟以前的一样,我们直接通过一个题目来讲了。这些东西我会打包放在评论区,然后。你们先看一下吧。他会在本地的四个九端口绑定,然后我们直接去连就可以了,先把这个运行起来。放在后台就可以了。好,那现在我们去连一下,可以看到他先输了一串字符串,然后我们随便输些内容,它会返回我们no game,那基于这个他他是这种情况的话,如果我们去不断的去尝试,比如说有很多个一,那如果他崩溃的话。
03:01
我们知道我们输了多少个,我们就可以确定它的占空间有多大了,因为我们输多了以后,它覆盖掉它的返回地址给搞崩溃了,对吧,然后这样我可以写成一个脚本。从一开始,然后连上以后,对吧,去输入多少个A,然后如果它返回的页面里没有no password,就是说它没有正常的去返回,也就是说它已经崩溃了,那我们就简易,因为我们加多了嘛,对吧,如果他。出错了,我们同样也要减一,那否则的话,我们就是一直加一加一,一直到它出现这两种情况为止了,我们来跑一下。可以看到他已经给我们得出了结果,就是说这个占空间是有72的。啊,就是计算它的大小。那这样我们就知道,在我们写了72个A以后,再往下写就是会覆盖返回地址了,那我们想要找一个东西叫做stop guard gets,如果把它作为返回地址的话,那程序返回到它以后不会崩溃,而是一一直在那里,就是相当于停在那里了,嗯。
04:24
为什么要找这个东西呢?我们是为了后面方便找一些用来攻击的god盖用的,大家想一下一下这个场景就是你想要找一个泡泡什么东西,然后return的一个命令的地址,那你只能去,因为我们没有二进制文件,你只能去在它返回地址上不断的让他去遍历来找,但是你怎么判断你已经找到它了呢?如果说你。确实是把这个地址放在了返回地址,它遍地到了已经,那它泡泡完以后再return,它还是会崩溃,你和这个地方直接崩溃是没有区别的,你没有办法判断已经是有执行过这个命令了,对吧?但如果有一个地址,它可以让程序停在那里,不会崩溃的话,就像就像下面这样了,你返回就是便利以后,便利到了这样的一个地址,它执行完以后把这个po出去,然后返回到这里,那它不会崩溃,而是sleep了,对,就这样,这样的话我们就可以起码我们可以确定我们是一个类似这样的对吧,Pop泡,然后return一个一个类似这样的。
05:34
指令已经执行过了。嗯,我们来看一下怎么找。首先它是给他设定一个地址,一般就是从400000开始让他去跑就是了,然后去便利嘛,对吧,它连上以后发送这个配料的,配料的是72个A,就是刚才我们找到的长度,然后加上想要去便利的那个地址。
06:01
这样如果他崩溃了,说明我们没有找到可以让它停住的地方,我们继续要加一,如果它是呃,这个地方说一下这个加我加了这个判断条件是因为。其实只是让他停住,可能作用并不是那么大,我们来看一下,因为毕竟我们还是有二进制文件的,我们来看一下。嗯,他之前我在做实验的时候,发现他找到的stop guard盖是可能是一个入口处,就是这样的,也可能是一个return的地址,就是这样的,但是在找过很多以后,我发现只有start的地址就是这里,以及幂函数的地址是可以在后面正常去利用的,嗯,所以就只是在这里,我就只让他去找能够从头开始那种start或者是密的地址了,而且这样也比较保险,对吧,你想象一下,你都是直接从头开始了,那肯肯定是不会有什么问题的,所以加了这个条件,然后。
07:17
我们来运行一下看看。他告诉我们,他找到的是4005C0,那这个地址就是start的地址,嗯,在VK里面,他用的是me的那个地址啊,哎呀。好,这是找他stop god gets啊这个东西,然后找到以后,我们就可以利用它能够停住这一个特点去找我们想要利用的其他的了,用来攻击的那种啊,就是这个脚本了。
08:01
因为我们已经找到可以停住的那个地址了,这个stop盖嘛,对吧,然后我们用来再再来去挨个的继续去遍历,我们想要找的是什么呢。嗯。因为就是说在之前return to CU里面,我们用的那个连续泡泡六个。然后再去返回的那那样的。那样的一个地址,嗯,他就就是很大,如果是遇到这种情况的话,很大可能性就是那个之前上面那个return to CU的那那一串盖,所以我们就来找这样的它。72个A以后,这个地址如果他能连续弹六个啊,然后再停住不崩溃的话,那就说明我们找到的确实是很有可能就是那一个了,那后面这个这一串的零是为了保证如果它越过以后它。
09:06
必须要崩溃掉,因为他可能后面有什么别的问题的话,他就不会崩溃,对吧,就填上一些零,让他确定他能崩溃掉。然后下面这个检查的这个脚本,是防止你找的那个东西以后它。就是可以看一下72个A,然后加上一个我们找到那个地址嘛,对吧,如果说他这样崩溃掉了,那它就是正确的,因为我们没有给他一个stop,刚才盖茨他返回的时候,返回的是A这样的一圈,A这样的一个地址肯定要崩溃掉,如果不崩溃的话,就说明我们找的那个地址可能是有些别的问题的,它不是POP6个,然后再return,可能直接就stop了。嗯,这是找用来攻击的那种。
10:04
我来运行一下。那这样我们就找到了这个地址,这是连续POP6个,也就是呃。那就是这里了。这个地址。接下来我们希望通过我们找到的这个BP盖,然后来获取put子的地址,那怎么搞呢?可以看一下这个我们找的那一串的pop泡,它是有一个这样的字解码,最后一个pop泡25,然后return,它对应的字解码是415 FC3嘛,但是如果你只看后两个字节码的话,它的意思是pop r Di,然后return,还记得之前。
11:17
在64位里面,它参数是先放在阿迪,然后再这样放对吧,那如果我们就可以通过BP我们找到的这个,然后加上九。这样的话,我们用拿拿到的这个地址啊,它就是pop阿迪,然后return这样一个地址,我们可以通过这个来去遍历。就是来找到PT兔子的PT,嗯,看一下这个pilo的,它首先是填了72个A来把那个返回地址给覆盖掉,然后到这个地方。这是我们找到那个BLP加九的位置,就是泡泡rdi,然后return的那个地址。
12:04
再把这是参数,嗯,主要就看这个东西吧,好吧,首先它会把它放pop pop到rdi,然后也就是说rdi的值是这里了,然后去遍历,如果这个地址它是po的那个地址的话,它就会把这个地址的内容输出出来,然后返回到stop盖对吧。那这样的话,我们可以把它复制出来看一下。啊。我们用打开看一下就好了,它前面这一串就是这个这个东西啊,就是我们想要让它找到这个。如果说他把这个地址能正确的打印出来,打印的是这个样子的话,那我们就认为他已经找到了POS的PT这个地址,那我们就可以把这个地址作为普函数,然后通过调用这个地址,让它不断的输出东西,把我们想要的东西都给输出出来。
13:14
就要达到这个目的啊。嗯。我们来跑一下看看。那他就帮我们找到铺子的PT地址了,找到以后呢,我们可以通过不断的铺子来把这个程序给downmp下来。我们来看一下它是怎么dump的。首先前面这一这一堆的话是长度,然后stop的地址,再加上那个BLP,然后它加九以后是泡泡RDR,然后return这一串,再加上puts plt的这个地址,这是相当于串参数了,对吧,然后。
14:16
这个地址我们从4000000开始,一直到401000为止,不断的去调用这个当函数,那这个当MP函数,它的参数是首先。我们看配料的首先是72个A,然后再把返回地址覆盖成泡泡,Return让让,就是让这个后面这一块作为铺子的。参数,然后再停住这样的一个就是在从头开始嘛,对吧。不断的去进行操作,嗯,就会把从40000~401000。开始这一整串的内容给down下来,我们来执行一下。
15:10
因为花的时间比较长,所以暂停了一下,现在他已经跑完了,把400000~40100整个的内容给我们downmp了下来,那它生成了一个叫code的文件,我们复制出来,然后嗯,看一下,用IDA打开。这里选择二进制的这种形式。在编辑。然后段。重新设置机址这个地方改成零叉,这个地址零叉400000,然后点击确定,那我们再来到就是之前找的啊。
16:00
40055,就是我们用呃,Put PT找到的那个地址。他的漂表象。嗯。那已经找到了,就在这,在这个地方我们摁一下C,它就会把这一段变成汇编的格式,我们可以看到这就是它那个PRT表上跳转的那个地址,因为我们已经put函数已经运行过了,所以这个地址就是它的got表里面的地址,那我们就把这个复制出来,当做put函数的got表的地址,知道它的以后,我们就可以用拉设置就直接搜了,对吧,就return to LA那种方法。
17:19
这些在这里,因为我们找到了这个put的got表,那我们可以用。嗯,这个。就是之前讲return to的那个就不多讲了,对吧,就直接去搜,然后return to去利用就可以了,我们来运行一下看看。他会需要去选择一个,我们就选乌班图的这一个可以了,然后就成功了。那这就是标。
我来说两句