欢迎来到兴华永恒!加入收藏设为首页
葡京娱乐网址
您当前所在位置:首页 > 手艺专栏 > 专业公布
手艺专栏

针对CVE-2015-2545破绽研讨阐发(中篇)


3.5.6 字典工具处置流程

枢纽的函数为forall在处置dict的历程,我们在第三个语句块首部分下断点<`EPSIMP32!RegisterPercentCallback+0x4664`>,察看断点,入栈了3个参数,挪用一函数,那么我们需求考虑下这三个参数是什么,经由过程查询<<PLRM2.PDF>>,我们获得关键性的资料,[`图2`]上面说假如第一个操纵是字典范例,那么它会入栈一个`key`和一个`数据`,这里相似哈希表的情势,经由过程一个key能够疾速获得对应的数值;为什么`图1`我写`pNext`,经由过程`图3`我们能够判定其内容能否为null,则`lea eax, [ebp-14]`eax取出来的是个指针,以是这里这个名字次要是便利辨认其为指针所定。

1491893143694777.png

图1

1491893171474704.png

图2

1491893193459016.png

图3

3.5.7 工具构造剖析

关于第一个CALL所做的工作,大抵能够分为3个方面,给PNEXT附值,给KEY赋值,给VALUE赋值,这里说的简朴,内里的功用CALL需求本人手动调试下做好记载愈加便利了解是如何赋值的历程,这里间接说下是如何获得的这些数值,起首看下`ECX`所对应的内容`图1`所示,此中`+0X8`偏移的位置是轮回遍历的次数,相当于一个`INDEX`也可以说是个`界线值`,内里的CALL轮回条件的范畴就是 `400`, 此中`+0XC`的位置`8`暗示`KEY`的个数,为什么,如`图2`所示,那么关于`+0X0`偏移的位置则是个`基址`的意义,所有的成果都是经由过程[基址+偏移*X]的情势获得响应的数据,`图3`暗示第一个`KEY1`中的内容,同时`2B4`则为下标,经由过程基址+下标*4便可获得第一个KEY1对应内容的地址,这0x28个字节就是个构造体,大抵内容以下所示,恰好能够跟我们的数据逐个对应,不外这里仍是需求`多跟几遍`才会愈加大白`构造`的状况,当跑完第一个CALL以后的内存状况如图4所示。

葡京娱乐网址

图1

1491893295712524.png

图2

2017-03-27_164236.png

图3

     

 struct {    
      dword * pNext; //指向下个构造体
      dword dwIndex; //下标
      ps_obj key;   //key
      ps_obj value;  //数据
      }kv_pair_element;
     
      struct PostScript object {
      dword type;//范例
      dword attr; //属性
      dword value1; //数据
      dword value2; //数据
      }ps_obj;
葡京赌场

2017-03-27_165635.png

图4

00030000[范例] 00000000[属性] 000001ff[数据]  04f32ea4[数据]
00000300[范例] 00000000[属性] 04f69db0[数据]  04f32ea4[数据]澳门葡京官方网站
04f8fd98[pNext]

3.5.8 开释空间函数阐发

第二call,第三call,为统一call,在对key与value停止操纵,copy到其他位置,以后的`PROC`则为重点call,此call则施行`forall`的所有的操纵,我们只需求在copy函数的位置下断点便可获得动身破绽的位置<copy:`EPSIMP32!RegisterPercentCallback+0x15582`>,然后我们单步跟随便可,这里能够先用ida察看下copy的大抵流程,然后经由过程静态的方法更好的去跟随我们想要的数据,因为copy的函数块比较大,静态调试起来也不是出格简单,我这里跟的时分是每一个call都跟进去了,很费工夫,但必定能够找到想要的函数数据的,这里我间接给下偏移<`EPSIMP32!RegisterPercentCallback+0x12e8e`>,如`图1`所示为开释历程的函数<`EPSIMP32+0x1a0e8`>,这个开释的历程能够认真察看下,还记得最开端的时分的this指针所指向的内容吗?[[this]],记得第一个call的时分,我们获得KEY1-KEY8都是存在以[[this]]为基址,然后加上一个偏移获得这些数据,第一次的轮回delete也是从[[this]]为基址开端遍历,判定能否为null,不是空则delete,那么最初这正片空间都被delete了,这个的范畴也是我们方才进入第一个call的时分的一个下标`400`,轮回完毕以后,delete this,而且清空`+0x0`, `+0x8`,就是清空key的个数。

1491893589730477.png

图1

1491893613379181.png

图2(开释:dict1 copy dict2—>开释dict2历程)

3.5.9 copy字典工具

以后会停止拷贝的操纵,要把dict1–>copy到dict2中,则会new一段空间,而这段空间刚恰好为之前所开释的[[this]],这里new的是`0x1000`巨细,而且经由过程`memset`清空方才申请的空间中的内容`图1,2`所示,以后会持续new0x28空间巨细,为什么?由于`dect1–>copy–>dect2`中,diect1只要`1个key`,则在0x1000中所添补的数据也就是1个4字节地址,以是需求new 0x28巨细来保留数据图3所示,copy完数据`图4`所示。

1491893712750396.png

图1

1491893741462057.png

图2(新new空间与开释的dict2分歧)

1491893794695892.png

图3

2017-03-27_184239.png

图4(new0x28巨细空间:内容pNext,index, 范例,属性,数据,数据,范例,属性,数据,数据)

3.5.10 添补机关数据

以后则为putinterval操纵的历程,这个就会添补我们的pNext指针所指向的数据空间,断点位置<`EPSIMP32!RegisterPercentCallback+0x160da`>,然后会停止`memcpy`的操纵,把我们数据恰好添补到我们之前的pNext所指向的空间中,如许会whlile轮回会再次跑一边,而此次的 key,vale则是我们本人所机关的指定数据,构造以下所示。

葡京赌场

图1

00000000[pNext]    000003ff[index]    00000003[范例]    00000000[属性]
00000000[key.valu1]    44444444[key.value2]    00000500[范例]    00000000[属性] 新葡京导航
00000000[value.1]    0462e0b0[value.2]//这里是本来数据,并不是复制过来的数据
在线征询 周一至周五
09:00-18:00