00:00
大家好,今天我们来看return to dl runtime result,那这个dl run time result,其实我们在那个动态链接的视频里面提到过,但是当时只是说他会去帮我们找到那个函数,我们想要调用的函数的地址,我没有深入的去理解一下他是怎么找的,嗯,如果想用这种方法的话,就必须去了解一下了,那这是这次实验的那个源码以及编译的命令,然后利用条件就不说了,我们直接调试着来看一下它的原理。首先我先找一个函数,呃,就是那种Co的指令,那我就为了跟这个对照起来,我就直接用里面讲的那个论了。给他在这里下个断点,然后跑起来,他会停在这个地方,对吧,然后我们SI单步步入,就是跟OD里面的F7差不多能走一步,他来到了这个地方,这是他自己的那个PT表象,然后它会跳到这个地址里面。
01:18
我们看他存的什么,可以看到它存的就是他下一条指令,好,我们继续单步来到了这个地方,它会push一个参数,然后。在涨账不到的这个地方,就是公共的PG表象了,我们继续单步啊,在这里你直接回撤,它就会重复上一步的命令,你不用再就直接不用输了,直接回车就可以,那来到了公共的PT表象以后,它会push。这样的一个内容,然后它的jump,那它在继续jump的时候,就跳到了这个dl runtime resolve这个函数的地方。
02:01
好,那在这之前我们可以看到,我们是push了两个参数,一个是在自己的那个嫖集表象里面push的一个零叉一零,还有一个是在公共的PT表象里push设了一个这样的内容,那这个东西这个零叉一零它呢。是dl time result的一个参数,叫做relo-arg啊,就是。这个东西就叫就是这个东西记记一下就好了,这里很多这种名,名字就很。很容易去忘掉它,就多看两遍吧,然后在公共的PT表现里面铺的这一个。这个东西它里面的那个值就是。它的另一个参数叫做link map,我们来看一下它到底是存的什么东西啊?
03:00
可以看到。它存的是这个地方,那通过这个link map,我们可以找到点dy aic的地址,就是这样,在这里的这里的第三个里面啊,就这那它就是这个点dy aic这样的一个地址,然后我们再通过这个地址,我们就可以找到这三个东西,它的那个地址。这里它都一样了,我就直接在这看了,首先是点DYSTR,它的地址是我们找到的上面这个地址加0X44,也就是这个地方啊,然后点DN。
04:02
YM,它的地址是加0X4C就是这个地方。然后是点real.pt它的地址是加零叉八四,在这个地方那找到这些东西以后,我们再拿刚才push的那个,就是他自己的PT表,像push的那个零叉一零啊,就是这个relo-arg啊,它加上这个点real.pt的地址,拿出来的这个就是得到的这个值。是从定位表向EF32-real这指针就记作real了,那找到以后就是这个地方吗?那它里面有两个东西需要注意,一个是are of s,也就是找到了这个。第一个,然后是R音后,也就是第二个啊,那拿到rin four以后,我们在右移八得到的这个四,那就是点DYNSYM的一个下标。
05:04
嗯,对于这个下标的话。我们之前在这个地方找到的这个点DYM对吧,我们来看一下,呃,30。就每一行就是下边为零,下边为一,下边为二,下边为三,下边为四,那这样的话得到的这个下标为四的这里是零叉二零,对吧?拿到以后这个零叉二零呢,就是它叫做name of s,也就是函数名称的偏移,为什么是偏移呢?是因为我们需要。在点DYNSTR加上这个name of set,那拿到的这个东西就是这里啊,啊,然后它就是叫ST内,也就是这个函数的。
06:03
字字符串就是存在这个地方了,然后它会通过动态链接库去找这个函数的地址,然后再付给论程表,那我们这里让它跑起来,让它去解析完成,然后我们看一下叉啊不对,叉杠S可以看到他已经因为我们已经跑完了嘛,对吧,那他得到了就找到这个字符串了。嗯,我们再整理一下,首先呢,这个dl runtime result,它需要两个函参数,第一个是自己的那个PRT表象push的那个内容,对吧,就是这个relo-arg,另一个呢,是公共的T表象push的那个内容,叫做link map,它通过这个link map可以找到点dy aic的地址,然后点dyic里面可以找到这三个东西,同时他找到了这一个,加上这个。
07:05
之前他自己的标题表象push的那个东西,它两个合起来找到的就是这个指针,那个这个指针里面它放着I of outside和I in for。把r four u18得到的就是点DYNYM,它的那个下标,它下标的内容呢,就是name of site。然后把name of site和点DYSTR加起来,得到的就是ST-name,那ST-name里面存放的就是函数的那个字符串了,函数名的那个字符串。好,这是呃,它的一个原理啊,然后。嗯,可以。就就自己多多看几遍,理解一下,这个东西说实话不太好记,这些东西就一开始我看的时候就容易混掉。那我们直接再来,就先不看这个这个地方,我们看RI,在介绍这个思路之前,我们先看一种站,叫做站迁移的手法,它会把站迁移到一个地方来执行,那它主要的思路是用live,然后return这样的两条指令,那live呢,它相当于这两条,这个Mo EP放到ESP里面,然后再泡泡EP return相当于泡泡EP啊呃,我们直接。
08:34
看一个表格。假如说我们现在有一个有占一出的那个函数啊,我们,然后我们输入的内容是这样的,这是占的那个垃圾数据占的空间,然后把EP覆盖成我们想要让它去掉的那个地方,也就是这里。然后在嗯这里说一下,在其实这一条质量level,然后return中的这个level,在程序返回之前,它是有过一次执行的。
09:27
可以看到这里它就是在返回的时候,前面已经有了,所以这个地方它首先会把EBP放到ESP,也就是。执行完以后就成这样了,那ESP和EBP都在这了,然后再pop EP,就是把这个内容这个假的这个EBP给这个EAPP,那所以执行完以后就成这样了。对吧,同时top的时候,那ESP它也会减去一个,就来到这儿了,然后在return的时候,我们就会去执行这个read函数,那read它会把我们再次输入的内容写到这里,就这样写到这个地方了。
10:09
然后read执行完以后,它是要返回到对吧,它返回的时候就返回到这个地方了啊,那返回到这个地方以后。我们就再去执行一次上面的这些命令,对吧,那呃,这那他会把EBP给ESP,那此时就是执行完以后就这样了,对吧?然后呢,它会pop泡EBP,就是把这里面存的那个内容给EBP,那执行完以后呢,就成这样了。游戏就来这了,然后这个时候你再去return的时候,因为之前泡泡的时候它同样会减嘛,对吧,这个ESP那就是看到这个地方了,如果这个地方你写的是一个函数的地址的话,那就去执行这个函数了,对吧,下面是它的一些参数之类的,就这样就相当于是把程序原本它是在这儿了,然后你给它迁移到这个地方来了啊,这就是在迁移。
11:12
那我们来看这个思路,首先我们看第一个,第一个它其实并没有什么东西,只不过是介绍一下价前移这种方法,实际利用了一下,嗯,它用的是pan里面的rop模块,也就是不,不需要去找这些东西了,我们只要用一个函数就可以做到。简单说一下,首先你要用的话,首先要创建一个LP的对象,然后LP.iw这样一个方法是在LP列里面填充off set和A,然后LP.read就是简单的调用一个read函数。为什么说简单呢?那其实它可以它是应该是lp.com,然后怎么怎么样的,那可以直接这样用这是函数的那三个参数标准的输入,然后地址以及长度对吧,那这样以后它去读入的内容就是我们第二次发送的那个配套那个那个LP链。
12:12
嗯,然后。它会把流程迁移到这个地方。也就是。这个这个这个地址是怎么设定的呢?就是本来我我们是想要让他去另一个地方写吗?但这个地方是BSS的地址,也就是这里我们找到的这个加上零叉800,就是比较网上比较普遍都是加这个数,这样一个地址可能比较稳吧,啊,然后他就。把程序的流程给转到这个地方,那这个地方会执行一个right写出来写的内容呢,是这个地方的地址啊,也就是在这儿了。长度是这个这个这个的长度啊,这是第一个,我们再来看第二个。
13:06
第二个它用到的是一个平精零,也就是公共的那个平体表象,在这儿可以用这种方法。去把PT0来找出来,然后用这样的一串计算方法来把那个right的他自己应该push的那个参数给找到,就是零叉二零,然后它程序会通过这一个来控制它走到这里,走到这个PLT0,然后它会去执行那个push命令,然后在jump嘛,对吧,Push的内容就是那个link map这个参数。那这样的话,加上他已经写好的这一个。Index杠,Arg这样的一个参数,它就实际上已经去够了那些东西了,对吧,想要那两个参数,然后去解析,再去执行right函数,这是第二个。
14:01
的那个那个意思,再看第三个。从第三个开始,我们就开始着手去伪造我们的那些参数了,嗯,然后上面还是一样,它会跳转到这个PRT0公共的PT表象,然后它的这里就变化了,这里我们改成了index of s,那我们看一下它是在哪里写的,在这里。之前我们它函数自己push的那一个实际上是re-RG嘛,对吧,那我们想要用它来加上点real.pt来找到这个real指针。嗯,Real指针里面存着的内容,它就是are ofset和r in four,嗯,然后我们现在把它改成了index of,这是怎么算的呢?我们看一下他用的是base-s stage加24减去LPLT嘛。本来我们是没plt加上这个参数的,那现在的话。
15:07
如果我们把这个内容加上6.prt,得到的就只是这一个内容了。也就是在。也就是这个地方的。所以他会带着。跳转到这个甲的这一个重叠位表象,那这里面存着的就是r of s和r in for,然后我们再继续深入去看一下第四个,嗯,这里其实上一步我们并不算是伪造,我们只是多多多帮他做了一步嘛,对吧,那这个地方本来它就是。本来我们用的就是已已经找到了,这还是就这样,然后那这一步我们要做的就是伪造一个假的点DYSYM,首先啊,我们R音后是。
16:03
右移八以后可以得到index,就是那个点DYSYM的那个下标嘛,对吧,然后我们如果把这个下标左一,八,然后再加上这个零差加这个零差七,主要是为了表示这是个导入函数,就。可以深入的去看一下下面这篇文章,以及上面这个地方,这个地方它有一个对齐什么的,就可以去看一下那篇文章。然后那。就我们伪造的这一个右移,把以后再加上七给他,那得到的这一个,它到时候它右移的时候,他会找到我们这一个,而不是他原本的对吧,那我们这一个。在这儿也是通过那个偏移来算的,就是假的减去真的这种这种偏移,各种偏移,然后。那他找到以后是在这儿的,就是我们可以看一下。
17:05
嗯。在那个点DYYM那个下边那一串地方。这个地方它是4C,然后000012嘛,对吧,那这就是伪造的那个。那一串也就是说零叉4C就是我们的name of s了啊,然后我们看第五个。嗯,这个地方写错了,这里应该是name ofet直接复制的,忘改了,嗯,这里我们看一下。因为我们那个。因为我们已经伪造出这个点DYSYM了嘛,也就是说这个name of site是我们可以控制的了,已经那它找那个函数字符串名那个字符串的时候,用的是name of set,加上点DYSTR对吧?那我们把name of set改成我们假的那个内某那那个自称的地址减去DSTR,当它用它去寻找的时候,一加这里就抵消掉了,然后得到的就是我们构造的那个甲的地址也就是在这儿了。
18:18
嗯,这就是,那那如果我们给这个地方改成也就是第六个了,我们改成这个sys TM system,那他找到的就是system,而不是以前的,就是因为它我们已经构造的让他迷惑掉它了啊好。然后这是一个用来攻击的工具,可以看到它的代码量实际上就特别少了,非常方便,只改几个地方就可以拿来用了,嗯,这个可以了解一下,然后vickki的看雪的这个思路的话,如果跟着wiki的思路走完一遍再看就比较简单了,那他主要是他用的这个是他自己找的,而不是直接用的那个胖里面的rop模块就多了一步,嗯,实际上不如VK的简单。
19:15
哦,那就到这儿吧。
我来说两句