00:00
大家好,这个视频我们来看return to LA,你控制程序执行LA中的参数啊,那然后通常的话是返回到P函数的PT处,或者是某个函数的具体位置啊,如果说一个程序里面它既没有system函数,也没有方便杠SH这样的字符串的话啊,我们除了写到。里面去对吧,那还可以去。那个library里面去找啊,那在vki里面是给了三个例子,其中第三个例子比较符合这这个呃,比较能体现出来,我们还是挨个看。首先看第一个我已经提前复制出来了,那我们直接ID打开看一下。我们想找的就是system函数的地址以及杠B-SH这样的字符串嘛,那我们看到它在段这个地方有一个PRT段,之前上个视频说的PRT段,实际上它是有一段代码去找那个函数位置的,对吧?那我们找看到了system这样的一个P级表象,我们可以通过返回到这个地方,那让他去找到system函数的地址,然后去执行,所以这样的话,我们就解决了system函数的地址的问题,就直接返回到这就行了,那还有通过shift加F12打开字符串窗口的话,会看到它是有杠B杠这样的字符串的,那字符串的问题也解决了是吧?那。
01:40
再来找它的占空间有多大,PB to,让命令让他跑起来,然后这边CCRC 150。
02:05
根据他报错的这个数,我们来看一下他的占空间是多大啊,可以确定是112了,好,那我们就可以构造XP了,首先是引入胖兔子这个库,然后我们是本地打麻,就process就可以了,然后。B这个是杠B-C这个字符串的地址,我们在这里找到的是08048720填上。再有就是system函数的地址,然后我们可以直接让他返回到PT表,让他再自己去找,那就是08048460,填上好,我们占空间是112,那我们先填上112,可以把它把占空间填起来,然后到返回地址的时候是返回到system的。
03:04
那system在正常程序里面,你去调用system,直接给他这个杠B-SH这个字符串作为参数,让他去执行就可以了,但是如果说你是通过返回到这样的。地址去让他再去找的话,你需要给他一个返回地址,给这个system函数一个返回地址,这里就是代表那个返回地址,但实际上我们已经打开了一个命令行了,对吧,它。杠B-SH打开了一个新的命令行了,那我们它返回不返回是无所谓了,所以这个随便填上就行。然后再发送配料的去打开这个交互,那我们来执行一下。可以看到已经成功了。好,这是第一个。
04:07
我再来看第二个。嗯,那第二个例子我也已经复制出来了,我们用IDA打开看一下,在他的这个嫖段,嗯,同样可以看到这个system这个表象,那我们可以跟上个例子一样,控制程序返回到这个地址,然后让他自己去找system的函数,呃,那现在我们需要的是杠B-SH这个字符串了,Shift加F12打开这个字符串窗口以后,我们会发现这个它没有给我们杠B-SH这个字符串,所以我们需要自己去搞啊那。在mini函数里面,你们按下F看一下为代码,它是有这个gets的,就是它会接收你的输入嘛,同样在plt段也有这个盖茨,所以我们可以控制程序返回到茨,然后来接收我们的输入。
05:19
那输入到什么地方呢?我们可以看一下BSS段。这边的话用GDP看一下它是不是可以写入。我们看一下这个地址大概是0804A0800804A080804A0大概是在这一段里面的,所以这个是可以写入的,那。
06:08
嗯,我们来看,先看一下XP是怎么写的吧。首先填的这一个,它是占的大小啊,占的大小我们可以。这样根据他出错来计算一下。还是112,那填充完站以后,我们就要填返回地址了,返回地址的话,因为我们需要再次输入这个杠B-SH,所以我们需要让他再返回到盖茨接受我们的输入。
07:05
也就是这里,它它返回到get,那你想要通过。想要通过这里这个PT段上的地址来调用一个函数的话,你需要给它返回地址,也就是。这个,然后还需要告诉他把这个杠B杠写到什么地方,也就是这里这个参数,这是。哎。那他写完以后,这个BSS里面BSS段上就已经有了杠B-SH了,那它再返回到system去执行,对于system来说,这里是它的返回地址。
08:14
啊,这里是它的参数。那system的话,我们已经打开了一个新的shell,所以是不需要它返回地址是什么正常的地址的,这不不用去管它,所以这样是可以正常运行的,那会看到这里还有圣德拉的一个杠BSH嘛,他会接受他的这个盖子,会接受它的输入,然后最后打开这个交互。
09:02
那就这里这样慢慢来运行一下。可以看到是成功了。这里再解释一个。在viki上,他给出了另一种P,嗯。是这样的。他多了一个。啊,他他是用这种类这种样子的,我们来看一下。这个先删掉。首先他填了112个A,填充量空间跟我们是一样的,然后返回到盖子去,再次获取这个杠B-S也是也是一样的,但是他后面的这个构造就不一样了。
10:05
首先这是它的返回地址啊,这是。然后这里是他的写到什么地方,他写完之后再返回到pop。那这一个作用是什么?泡泡一,嗯,实际上它这个泡泡是泡泡的一个寄存器里,把占顶泡泡到一个寄存器里面嘛,对吧,那他执行这条命令的时候是。它是占顶啊,所以他会把它给泡泡出去,那现在。站点就是它了,然后它返回的时候返回到system来执行那的返回地址以及。
11:03
这个这这个杠B-SH的地址是这样的啊。啊,应应该能讲懂吧,这样啊。嗯,那好,我们来看第三个例子,第三个例子有没有IDA,打开看一下。嗯,当我们可以看到它是没有了,这个平器里面是没有system了,然后我们shift加F12看一下字符串也是没有杠B-SH了,那这样的话我们需要。用LA中的system和杠B-SH,那知道了LA中的一个地址,就可以确定LA用的什么版本啊,通过这个东西来找到他的版本。
12:07
然后呢,通常的话是通过高表泄露,然后。由于的延迟绑定机制,你需要泄露的必须是已经执行过的函数,那我们来看一下。在它的幂函数里面,F5看一下伪代码,铺子函数是已经执行过的,所以我们可以通过POS函数来泄露他自己真实的地址,因为铺子是输出嘛,对吧。嗯。那我直接给按这个P来讲一下。首先要引入这两个库,一个是po to,一个是Le search,然后的话,这是之前说的,就是打本地的话要用这个函数。那这个elf可以。
13:04
可以看一下这篇文章,他介绍的那个的库。这个库的一些用法什么的,然后就是下在下面这个地方。可以分析EF啊,那这样的话。这两条命令分别拿到了普函数的PT和交T,然后用这条命令可以拿到告start这个地址,那我们可以看一下g start函数跟mini函数的区别,Mini函数是用户代码的入口,然后gun start是系统代码的入口,是是程序真正的那个入口。啊,我们思路是让。这个第一要泄露两次,第一次呢是通过这个put函数把它的自己的地址打出来,然后通过LA search去找那个LA,然后第二次就是拿到这个shell了,我们看一下这个图,第一次先填充这个占空间啊。
14:16
还是那种方式计算一下。他也是没有变的,还是112。然后返回到POS函数,那返回去以后。对于这个put函数来说,它在下面就是它的返回地址以及它的输出的内容了,那我们想要输出的是put的真实地址,那就让他输出puts的go这里。
15:07
这个我们之前拿到的,然后这样的话,我们通过。就是发送资料,然后我们可以通过U32,它对应的是那个P32嘛,就是。这样的话就拿到put的真实地址了,然后再用LA search这个函数来搜一下它对应的那个LA就是put,然后加上put函数的地址来搜出那个LA。这样的话我们已经知道了。他。Le的版本了,然后的话,Puts函数puts-ADR代表的是puts函数这个真实地址,然后la.dump put。得到的是puts函数在这个library里面的偏移,那这样的话。
16:04
真实地址减去偏移就可以得到这个的基值了。那我们再通过基址去计算各种那里面函数的在现在这个环境里面的真实地址,就可以呃,得到他们的真实地址了嘛,对吧。Li基值加上它在LA中的偏移,然后拿到的就是在现在这个环境里面,它的这个函数,System函数的真实地址,那注意一下是字符串的话,用这种形式啊。然后就正常的占一处对吧,首先是填上站,然后返回地址是system函数的地址,就是我们计算得到的这一个,然后填上四字节以后,这四字节是system的返回地址啊,我们之前说过这什么都无所谓了,只要有就可以了,对吧?然后是他的杠B-SH这个字符串的地址。
17:05
作为它的参数去打开一个shell,那我们来运行一下。嗯,可以看到已经正确的拿到这个事了。嗯,这就是return to LA。
我来说两句