学习了UAF,分析了几个漏洞,同时,也熟悉了windbg的用法,收获挺大。

  基本的UAF分析流程如下:

    i:找有漏洞的函数

    ii:找到被释放对象的类型,以及被释放对象在内存中的位置

    iii:理解对象的释放方式

    iv:重写被释放对象的地址空间

    v:理解漏洞的根本成因 

  i:寻找有漏洞的函数

    打开poc.pdf,出现了异常

(2f0.d64): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=0c0c08a8 ebx=00000001 ecx=069d91c0 edx=292885fd esi=069d91c0 edi=00000000
eip=4a82f129 esp=002be1a0 ebp=002be1c4 iopl=0         nv up ei pl nz ac po cy
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00210213
4a82f129 ??              ???

查看堆栈,来分析函数调用流程,如下:

0:000> kb
ChildEBP RetAddr  Args to Child
WARNING: Frame IP not in any known module. Following frames may be wrong.
002be19c 6257e85d 58e57dd9 00000001 069d91c0 0x4a82f129<2>
002be1c4 6257e0d2 00000000 069d91c0 00000000 AcroRd32_623e0000!DllCanUnloadNow+0x150536<1>
002be1e8 6257f3e3 002be23c 6257d996 6257f409 AcroRd32_623e0000!DllCanUnloadNow+0x14fdab
002be1f0 6257d996 6257f409 0681ad20 58e57e21 AcroRd32_623e0000!DllCanUnloadNow+0x1510bc
002be23c 6257c68c 00000000 58e57e71 0681ad20 AcroRd32_623e0000!DllCanUnloadNow+0x14f66f
002be26c 6257c50e 067dc0f0 0690caf0 58e57ee1 AcroRd32_623e0000!DllCanUnloadNow+0x14e365
002be2fc 6257c206 0681ad20 069763f8 002be318 AcroRd32_623e0000!DllCanUnloadNow+0x14e1e7

  可知,函数是从6257e85d之前调用的:

0:000> ub 6257e85d
AcroRd32_623e0000!DllCanUnloadNow+0x150518:
6257e83f 897dfc          mov     dword ptr [ebp-4],edi
6257e842 ff96d0020000    call    dword ptr [esi+2D0h]
6257e848 0fb7d8          movzx   ebx,ax
6257e84b 8b06            mov     eax,dword ptr [esi]
6257e84d 59              pop     ecx
6257e84e 8bce            mov     ecx,esi
6257e850 66899ecc020000  mov     word ptr [esi+2CCh],bx
6257e857 ff9064030000    call    dword ptr [eax+364h]

  可知,6257e857为crashfun

  ii:找到被释放对象的类型

    分析上面汇编,易知esi的地址的值为虚表指针:则可以通过esi和windbg来分析被释放类型,如下

0:000> !heap -p -a esiaddress 069d91c0 found in_HEAP @ 2ea0000HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state069d91b8 0071 0000  [00]   069d91c0    00370 - (busy)

  大小为370,同时,esi的地址也为对象地址069d91c0

,可以得到。

  iii:查看被释放对象在内存中的地址

  观察异常前的堆栈

WARNING: Frame IP not in any known module. Following frames may be wrong.
002be19c 6257e85d 58e57dd9 00000001 069d91c0 0x4a82f129<2>
002be1c4 6257e0d2 00000000 069d91c0 00000000 AcroRd32_623e0000!DllCanUnloadNow+0x150536<1>
002be1e8 6257f3e3 002be23c 6257d996 6257f409 AcroRd32_623e0000!DllCanUnloadNow+0x14fdab

  采用虚拟机回滚的方法来简便堆的调试

  根据猜测,查看<1>的函数的调用处具体代码,并对该函数下断点。如下

eax=65f607a4 ebx=00000000 ecx=059f7d48 edx=00000483 esi=059f7d48 edi=00000001
eip=6553e0cc esp=0022ddcc ebp=0022dde8 iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00200202
AcroRd32_653a0000!DllCanUnloadNow+0x14fda5:
6553e0cc ff909c020000    call    dword ptr [eax+29Ch] ds:0023:65f60a40=6553e7f8

  查看esp+8,即为对象地址。如下:

0:000> dd esp
0022ddcc  00000000 05a5bbc8 00000000 00000001
0022dddc  00000000 00000000 00000000 0022ddf0
0:000> !heap -p -a 05a5bbc8 address 05a5bbc8 found in_HEAP @ 10a0000HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state05a5bbc0 0071 0000  [00]   05a5bbc8    00370 - (busy)? AcroRd32_653a0000!CTJPEGDecoderCreateUsingData+2b41340:000> dd 05a5bbc8
05a5bbc8  65f607a4 00000000 65f6077c 00000000
05a5bbd8  00000000 65f6073c 00000000 65f60728
05a5bbe8  05bc8bc0 00000001 02641ff8 00000001

其中,05a5bbc8位置的值即为虚表指针。

  iv:理解对象的释放方式。

  直接通过buntdll!RtlFreeHeap ".if(poi(esp+0xc) == 05a5bbc8) {kb} .else{gc}"来查看堆栈的情况,并与crash时的堆栈进行对比,如下

0022d1c4 6553f5ae 00000001 00000000 05dd6c50 AcroRd32_653a0000!DllCanUnloadNow+0xa5956
0022d218 6553f41b 0022d24c 6553e848 05dd6c50 AcroRd32_653a0000!DllCanUnloadNow+0x151287
0022d220 6553e848 05dd6c50 2b83a232 00000001 AcroRd32_653a0000!DllCanUnloadNow+0x1510f4
0022d24c 6553e0d2 00000000 05a5c2d8 00000000 AcroRd32_653a0000!DllCanUnloadNow+0x150521
0022d270 6553f3e3 0022d2c4 6553d996 6553f409 AcroRd32_653a0000!DllCanUnloadNow+0x14fdab
0022d278 6553d996 6553f409 05dd6c50 2b83a2ba AcroRd32_653a0000!DllCanUnloadNow+0x1510bc

crash时:

0022dd9c 6553e85d 2b83adba 00000001 05a5bbc8 0x4a82f129
0022ddc4 6553e0d2 00000000 05a5bbc8 00000000 AcroRd32_653a0000!DllCanUnloadNow+0x150536
0022dde8 6553f3e3 0022de3c 6553d996 6553f409 AcroRd32_653a0000!DllCanUnloadNow+0x14fdab
0022ddf0 6553d996 6553f409 05952238 2b83ae42 AcroRd32_653a0000!DllCanUnloadNow+0x1510bc

可以得出,函数在堆栈情况如下的函数中进行了释放

0022d24c 6553e0d2 00000000 05a5c2d8 00000000 AcroRd32_653a0000!DllCanUnloadNow+0x150521

如上所说,即在6553e0d2中释放,利用ida分析该函数。根据FreeHeap的kv情况,可以得到释放函数为对象的一个虚函数,如图所示

6553e82b 7461            je      AcroRd32_653a0000!DllCanUnloadNow+0x150567 (6553e88e)
6553e82d 8d45f0          lea     eax,[ebp-10h]
6553e830 50              push    eax
6553e831 8d4e1c          lea     ecx,[esi+1Ch]
6553e834 e8e607f5ff      call    AcroRd32_653a0000!DllCanUnloadNow+0xa0cf8 (6548f01f)
6553e839 ffb6d4020000    push    dword ptr [esi+2D4h]
6553e83f 897dfc          mov     dword ptr [ebp-4],edi
6553e842 ff96d0020000    call    dword ptr [esi+2D0h]

如图,esi为被攻击的函数对象的虚表指针。函数流程为[esi+2D0h] ,其中eax为另一个对象虚表指针。根据poc可得,该函数为addButtonFunc()函数,

  v:重写被释放对象的地址空间

    通过下断点分别查看在6553e0cc,6553e857,crash时对象的情况,可以得出,填充在调用6553e857之后,crash之前,如下:

//断在6553e00c时
0:000> dd 5c473d0
05c473d0  65f607a4 00000000 65f6077c 00000000
05c473e0  00000000 65f6073c 00000000 65f60728
05c473f0  05c66420 00000001 02642260 00000001//断在6553e857时
0:000> dd 5c473d0
05c473d0  65f607a4 00000000 65f6077c 00000000
05c473e0  00000000 65f6073c 00000000 65f60728
05c473f0   05c66420 00000001 02642260 00000001//crash时
05c473d0  0c0c08a8 41414141 41414141 41414141
05c473e0  41414141 41414141 41414141 41414141
05c473f0   41414141 41414141 41414141 41414141

  vi:理解漏洞的根本原因

    仔细分析调用流程,函数流程为[esi+2D0h]-->6553f409-->[eax+16]->,在6553f995处下断点,可得,其中eax为esi的虚表指针,而esi为一个对象的首地址,即在对象被释放前先生成了一个新对象。

赋值语句如下

.text:6019F595                 lea     eax, [esi+8Ch]
.text:6019F59B                 mov     ecx, [eax]

查看esi对象的堆的情况,如下。

0:000> !heap -p -a esiaddress 059fef10 found in_HEAP @ 10a0000HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state059fef08 0021 0000  [00]   059fef10    000fc - (busy)? AcroRd32_653a0000!CTJPEGDecoderCreateUsingData+28779c

在05ae857设置断点,可看到释放对象在生成的对象为参数,且参数中含有对释放对象的引用,只要对该对象进行应用就可以产生UAF漏洞了。

  vii:总结

    创建一个父对象,poc所示为ToolButton,然后设置一个函数,函数创建一个子对象,子对象设置函数,对父对象进行删除,且保留了对父对象的引用,对子对象函数进行调用,即可产生UAF漏洞。

转载于:https://www.cnblogs.com/0xJDchen/p/5980807.html

UAF学习之Adobe reader CVE-2013-3346相关推荐

  1. 50天内50个CVE:模糊测试Adobe Reader

    50天内50个CVE:模糊测试Adobe Reader 介绍 2017年是漏洞领域的一个转折点. 当年报告的新漏洞数量约为14,000,是前一年的两倍(见下表). 可能的原因是自动漏洞查找工具(也称为 ...

  2. Ubuntu 14.04 64位上安装Adobe reader 9.5.5

    首先说明下面的方法本非完美的方案,但是我试验了下,确实可行. 1.从Adobe官网下载最新版的Adobe Reader 9.5.5的deb包,在下面的ftp位置: 2.安装相关依赖库,主要是ia-32 ...

  3. Android Adobe Reader 任意代码执行分析(附POC)

    livers · 2014/04/18 14:05 0x00 描述 前几天老外在fd还有exploit-db上,公布了Adobe Reader任意代码执行的漏洞. 漏洞编号: CVE: 2014-05 ...

  4. 添加源ubuntu_x64 安装 Adobe Reader

    题记:写这篇博客要主是加深自己对添加源的认识和总结实现算法时的一些验经和训教,如果有错误请指出,万分感谢. 媒介:Adobe Reader for linux 只有32bit 1.添加源:You wi ...

  5. Acrobat/Adobe Reader字符显示有毛刺的解决方法

    Acrobat/Adobe Reader字符显示有毛刺的解决方法 在编辑->首选项->页面显示->渲染中,平滑文本选择用于显示器即可解决. 另外向大家推荐Acrobat,可以修改PD ...

  6. ubuntu18.04.3安装和卸载Adobe Reader 9

    为了和自己的win系统对接起来,打算尝试一下Ubuntu系统上的Adobe Reader(这个软件官方已经放弃更新,可以获得最新版是9.5.5),话不多说安装过程如下: 获取软件包 wget ftp: ...

  7. adobe reader linux rpm,centos6.5下安装adobereader

    环境centos6.5 在下地址中下载adobereader安装包 ftp://ftp.adobe.com/pub/adobe/reader/unix/9.x/ 本人下载.rpm包 下载中文包 Fon ...

  8. Adobe Reader 文档无法签名_Adobe | Acrobat amp; Reader多个安全漏洞通告

    0x00 漏洞概述 2020年11月03日,Adobe发布了关于Adobe Acrobat和Reader的14个安全更新,其中包括多个任意代码执行漏洞.Adobe表示目前还没有发现任何关于这些漏洞的野 ...

  9. 解决Adobe Reader安装错误150120

    今天Adobe Reader这个软件提示有新版本了,让我更新,出于信任,我不假思索地更新了Adobe Reader这个软件,于是我倒霉的一天就在这之后了. 我用这个软件打开赛灵思的DocNav里面的赛 ...

最新文章

  1. 最小二乘法+牛顿法+拟牛顿法+梯度下降法+梯度上升法+共轭梯度法
  2. c语言多组输入字符,关于c语言中 scanf 对多行字符的输入问题
  3. python matplotlib.pyplot.scatter() 中的cmap参数是什么意思?
  4. 正则表达式的一点说明
  5. .NET 云原生技术使用调查
  6. ubuntu系统DD对拷还原报废笔记本
  7. 敢问北极熊,路在何方?
  8. 8-4 测试http服务器(上)
  9. HDU2032 杨辉三角【入门】
  10. Tensorflow实例,拟合二维数据
  11. 在Linux系统编译DCMTK的源码得到其动态库文件和可执行程序
  12. ContextCapture(Smart3D)资源汇总
  13. 3.3.7 使用difflib.get_close_matches函数
  14. 概率论与数理统计学习笔记(3)——Pearson相关系数与Spearman相关系数
  15. EDM广告邮件代码内容编写参考建议
  16. Fedora13 添加 网易镜像源
  17. chmod 777的含义
  18. 《计算机网络--自顶向下方法》第三章--运输层
  19. python学习(二)配置开发IDE(windows)
  20. 螺旋无限延伸_八卦中的双螺旋结构,无限大∞符号隐含的秘密

热门文章

  1. AI监测分析课堂背后的旷视科技:清华学霸创立,半年亏损52亿
  2. 宇宙第一 IDE Visual Studio 2019 正式发布
  3. VirtualBox 启动时提示“获取 VirtualBox COM 对象失败”的解决
  4. Collection接口详解
  5. 32位数型计算机什么意思,展示32位是什么意思
  6. java contains_Java基础教程|生成不重复随机数 java
  7. RabbitMQ 高可用之如何确保消息成功消费
  8. python re库函数_python re库的正则表达式学习笔记
  9. mysql+monitor+下载_详解MySQL监控工具 mysql-monitor
  10. 套接字没有连接并且没有提供地址_网络是怎样连接的 -- web服务器接到请求后将会做什么...