00:00
大家好,今天我们看SLP,它是主要用的这个东西啊,嗯,它是在unix发生这个signal的时候间接调用的,我们看一下它这个过程就是当系统进程发起一个新的时候,那个进程会挂起来,然后内核会对这个进程进行一些操作,保留它的上下文,主要的操作就是把寄存器压到站里面,然后压入一些其他的信息等等,那当他处理完这个东西的时候。那它就会恢复原本的那个进程的上下文,那恢复的过程就是通过这个东西来把原本压入站,压入站的那些寄存器的内容还给原来的那个寄存器,这样的话,我们的想法是如果我们自己构造一块站上的内容,那我们如果去能够去触发这个系统调用的话,那他给我们寄存器负的值就是我们构造好的,我们就可以间接的控制我们寄存器的内容了。好,我们来看一个题目。
01:06
这个题目它是一个64位的,然后用IDA打开的话,就只有这么几行,我们打开看一下。首先他有一个抑或的操作,把ix抑惑一下,就他自己疑惑自己的话,就直接置零了嘛,亦或是相同为零,不同为一,然后他会把磁100H放到EDX,把RP放到RI里面,把rax放到rdi,那这个操作做完以后,RSI和rdi,还有REDX分别就是它要去调用的那个三个参数了,然后它是怎么调用的,用这个system扣,System扣它的系统调用号应该是放在ix里面的,Ix被指为零了,所以系统调研号就是零,那我们看一下,零的话调用的是锐的函数,也就是说整个的这个过程,它实际上就是。
02:06
啊,它实际上就是执行了这样的一个操作,往战警去写0X400字节的内容,我们来看一下这个H叉P。首先这个system code的地址和这个start的地址就对应的是这里这个system call和这个start啊,然后我们来看它发送的第一次,他发我们要执行的这个read嘛,对吧,它会接收我们发送的数据,那我们发送的是三个start的地址,也就是这样。那它接收完以后,它返回的时候,返回的是站RP站顶的这个地址,也就是我们写的这个sat的地址,然后他回去以后,他会再接受我们输入,那第二次我们输入的时候发的是一个杠叉B3啊。这一个是达到这样的一个效果。它首先把。
03:01
RP,也就是之前的start-ADR的最后一位改成了这个差比三,然后它我们那个read函数,它会把我们读入的字节的数目放到rax里面,也就是说这样的话,Rax就被设置为一了,因为我们只写入了一个,然后那同时我们返回地址改成了这一个,就是对应的这个地方。他不会去执行这一个异或的操作,那我们rax就不会被置为零还是一嘛,然后他在下面系统调用的时候,也就是去调用了这个right。这样的话,我们会把占顶零差400的内容给输出出来。那我们输出以后,实际上。在一开始还有一个之前写的那个。Start a DR吗?然后我们想要达到的那个内容实际上是在后面,所以我们是有这样的一个操作,那right函数执行完以后,它再返回去,再去返回那个start-ad点的地址,再去执行的时候,又再一次接受我们的输入,那接下来我们要输入的就是我们构造的那个站上的内容啊,我们。
04:23
是可以用那个po套里面的这样的一个功能,直接给它写好了,然后我们看我们发的那个配料的就是这里。首先我们发一个start的地址,然后发一个system code地址,然后发就是上面这一串了,那我们来解释一下,首先它读入以后返回到这个地方对吧?那我们返回以后会再去进行读读取吗?那我们再一次发的时候就是这里了。我们发的是上面这个配料的的。这里发了一共15个嘛,对吧?呃,为了防止,为了防止我们会影响他,我们直接是发的。
05:08
直接是发的这个配料的里面截取的从第八个到第八加15个这样的一个内容,那它还是就就不会去改写它呀,那这样的话,因为我们读了是15个ix,它就是15对吧,那这样然后我们去执行system call的时候,就会去执行第15号的这个东西,也就是我们说的这一个,那它就会把我们站上的内容给还还还原到那个寄存器上。嗯,还原以后,它的IP也就是这个地方,这个C怎么靠这个地址,那它会再去执行我们已经构造好的ix是瑞的,然后它的参数就是这张就会它会往这个我们找到的那个站上的那个地址去写400字键。为我们为什么要这一步呢?因为我们现在我们根本就不知道它占上的地址在什么地方,然后我们需要通过前面这个right函数把一个地址泄露出来,那我们再往这个地址去写东西啊,我们得知道我们写到了什么地方才能去用吧,对吧,那通过这样的一个调系统调用,然后我们就再一次执行了RAID,那我们再一次读入的就是发送到这一串,我们来看一下。
06:27
它首先是start的地址,然后加上这个C,怎么然后return,然后加上构造的这些内容啊,那后面他又补了一串,就是这。整个。这样的话,前面这一块加上上上面这一块合起来是一百二一百二以后写了一个杠,B-SH对应的就是这个地方,这个地址加上零叉120拿到的就是这一个,也就是exe的一个参数。
07:01
那然后我们第一次发的时候发送,发送过去,它首先会返回到这个start,再一次执行那个read来接收我们输入,那我们输的时候输的就是。这个也就是15个字节,然后通过这个书的15个字节,我们去再一次去调用这个东西对吧。那这样的话,它返回系统调用的时候,就直接去执行这个。他会把我们之前部署在账号的内容给返返就还回去了,然后的话,那它在返回的时候,我们看一下它在返回的IP。就是system code的地址,也就是说他会去执行这一个了,那这一个的话,就是我们构造好的那个exe对吧,那这样的话我们就拿到这个权限了。CH。
我来说两句