首页
社区
课程
招聘
[原创]Adobe Acrobat Reader 漏洞分析过程
2008-6-28 19:32 9827

[原创]Adobe Acrobat Reader 漏洞分析过程

2008-6-28 19:32
9827
前些天朋友给了一个pdf的poc,让分析一下其漏洞的成因,终于在最近有了头绪,现将分析思路整理归纳一下。
  
        由于以前没有研究过pdf,所以先找到pdf的结构资料及说明文档,大概有所了解后。开始有针对性的对poc进行Fuzzing测试,定位出了文件中0x5455(不同poc可能不一样)开始的一段数据是shellcode。修改代码使之进入死循环。然后打开poc,用softice断下来,程序停在shellcode的入口处。经过几次测试发现,程序不是很稳定的停在一个固定的地址0x3445455,也就是说shellcode不是每次都被加载在相同的位置,但基本上只要不重启系统此地址就不改变。
  所以仍对此处下内存写入断点:
  
  bpm              3445455        w       
  
          断下2次后(次数不固定,跟系统状态有关),跟踪程序运行至0x280b0b
  
  280b0b        ff5530                 call        [ebp+30]; [ebp+30h]=[12ceb4+30h]=[12cee4]=12f56c
         
       也就是说此时程序进入堆栈执行,而12f56c的内容是一长串跳转指令,紧接着是一段解码指令,然后跳转至3445455执行此处shellcode。继续往上分析,查看此时堆栈中的返回地址,
  不难得出0x280b0b是在0x7c90e465处子过程中被执行的。
  
          这个溢出中,有一处比较特殊,0x280b0b。起初没有怎么留意,后来在几次尝试后才发现这个地址是固定的,即每次都要通过此处来跳转到堆栈中去执行。而且此处就在unicode.nls的空间内,而unicode.nls在系统中的位置基本都是固定不变的。分析0x280b0b处的作用,与一般的溢出流程作比较,0x280b0b就是一个跳板,将程序流程指向到堆栈中去执行,相当于广义上的jmp esp/ebx之类的作用。所以在程序空间肯定能找到字节 0b 0b 28 00,并且这个字符是作为一个地址存放在这个空间的某个地址addr1,addr1有可能是存放函数返回地址,也有可能是  存放着函数的指针,经跟踪发现addr1存放的是异常处理函数的地址,在后续利用中会用到。
          在程序的执行过程中addr1被字节0b 0b 28 00 覆盖。
  
          故,        bpx        7c90e465
  
                      s            0000         L         ffffffff         0b 0b 28 00
  
                      found   12d280
  
                  12d280        0b 0b 28 00 eb 06 eb 06-0b 0b 28 00 eb 06 eb 06       
  
          发现,程序对12d280后的连续区域写入0b 0b 28 00 eb 06 eb 06,而addr1也应该在此区域里,所以,对12d280下内存写入断点               
         
          重新打开poc,当向12d280写入字节0b 0b 28 00时,程序停在AcroRd32.dll(漏洞就存在于这个文件中)空间里。
  
          c1070b        6689447590        mov        [esi*2+ebp-70],ax ;(没有进行严格长度检测,                 导致写入地址违规)
          c10710                  inc           esi
          c10711                 cmp         esi,2000 ;(没有进行严格长度检测)
          c10717                 jnz          c1073f       
          ......
          c1073f                  inc          ebx       
          c10740                 inc         ebx
          c10741                dec        dword ptr [ebp-74]
          c10744                cmp    dword ptr [ebp-71],00
          c10748                jnz         c10651
          ......
          c10651                movzx        eax, word ptr [ebx]
          c10654                cmp        ax,25
          c10658                jnz        c1070b
  
          跟踪调试,当esi = 16c0时(esi < 2000h)
  c1070b        mov        [esi*2+ebp-70],ax ; [esi*2+ebp-70] = [130000]
  ......
          写入地址访问异常,调用异常处理结构处理,此时程序跳至7c90e45c,而内存地址7c90e45c对应ntdll.dll的KiUserExceptionDispatcher导出函数。
  
漏洞成因:没有进行严格长度检测(esi < 2000h),导致写入地址违规(0x130000),触发异常,而在本利用中,覆盖了异常处理函数的地址,使之经过跳板指向自己布置的shellcode,从而成功利用。
  
              主要是和大家交流一下分析思路,出于安全考虑,poc就不给出来了。

[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

收藏
点赞7
打赏
分享
最新回复 (17)
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
maplelxf 2008-6-28 20:54
2
0
强,学习一下,
雪    币: 124
活跃值: (70)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
jskew 1 2008-6-29 01:22
3
0
很强大,膜拜
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
soshort 2008-6-29 05:11
4
0
最近我也在研究某些漏洞的利用方式,想和LZ简单讨论一下,mail至   0x07c3 在 gmail 点 com,留个联系方式。:)
雪    币: 189
活跃值: (46)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
惜u雪 2008-7-17 10:42
5
0
强大,学习了……
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
小小愿望 2008-7-17 11:03
6
0
其实不懂
no understand
雪    币: 563
活跃值: (95)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lixupeng 2008-7-17 12:40
7
0
关注!!!!!
雪    币: 2362
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zapline 2008-7-17 12:59
8
0
你行!!!!
雪    币: 238
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
笨石头 2008-7-29 11:18
9
0
楼主很强大,能否交流一下。以前也研究过类似的pdf shellcode,但是该码是在加密处,如果不先进行解码,就无法通过修改pdf文件达到断下shellcode的目的。关于楼主所分析的地方,不太清楚的是,楼主是通过什么样的方法fuzzing确定shellcode位置的?
雪    币: 197
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
爱上学习 2008-7-29 11:29
10
0
本人也很想学习一下楼主的方法,还有楼主能否提供一些pdf的文档资料啊,可以给个网站地址什么的。
雪    币: 218
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
scuxiao 2 2008-8-25 18:00
11
0
楼主这样分析确实很强大.
但觉的有不足之处,所以建议楼主去看一下嵌入该pdf的脚本,如果用profession版本就可以看的到,使用高级-->javascript,当然是不触发该漏洞的前提下.
纯粹的逆向分析对于此类由于脚本函数溢出成因的追踪成效并不是很大,我在分析flash上就花了很多时间,理解起来还是不那么透彻,但是如果结合起FLEX技术,就很容易了.
本人愚见,与楼主分享
雪    币: 221
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
expmonking 2008-8-26 09:29
12
0
楼上说的有道理 ,不过当时是想从对一般的漏洞的分析角度出发,做一次练手的。
楼上的方法也是在后来才知道的。因为不知道professional版的还原脚本功能,偶还专门写了一个解码和编码的程序用来还原pdf的内容,当然也包括脚本的部分,以及对内容的编码。
谢谢楼上提醒
雪    币: 205
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
rainler 2008-9-16 09:51
13
0
研究一下楼主的思路。
雪    币: 208
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
junxiong 1 2008-9-16 12:11
14
0
强,学习一下!
雪    币: 238
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
笨石头 2008-9-17 21:02
15
0
在分析的过程中,该漏洞对于低版本的OLLYDBG会进入死循环,最好是用2.0的英文原版会比较好。
雪    币: 251
活跃值: (25)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
newjueqi 7 2008-9-18 09:57
16
0
高手,学习了
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
JINN 2008-10-9 11:32
17
0
只是shellcode处在加密区,不好判断~~~~~~~~~~~~~~~
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hellodmp 2008-11-1 15:44
18
0
楼主,我也想玩玩这个poc,可以的话emil给我 exploitest@163.com
游客
登录 | 注册 方可回帖
返回