【漏洞分析】Adobe Acrobat和Reader整数溢出漏洞(CVE-2012-0774)

0x00 前言

总体来说坑不多,但是对于windbg没有watchpoint功能这一点,真的是很坑。

0x01 简介

Adobe Acrobat和Reader在True Type Font (TTF)处理的实现上存在整数溢出漏洞,攻击者可利用此漏洞执行任意代码。
受影响软件版本:
Adobe Reader 9.4.[0-5]
Adobe Reader 9.3.[0-4]
Adobe Reader 9.2
Adobe Reader 9.1.[0-3]
更多详情,请参考【bid-52951】

0x02 漏洞原理

True Type Font字体文件中使用预定义的指令集控制字体hinting,当执行到MINDEX指令时,被操作的数组长度n溢出成超大值,导致数组写越界。

MINDEX指令:对size为n的数组进行循环左移一位。

0x03 漏洞分析

运行环境:

版本
操作系统windows 7 sp1 32bit
调试器windbg 6.12 32 bit
漏洞软件AdbeRdr940_zh_CN.exe
文件查看器010editor
反编译工具IDA

poc 如下图所示,问题数值n是由多个值经过计算得到的,无法在poc文件中直接看到,这里展示的计算前的输入数据。
在这里插入图片描述
需要说明的是漏洞出发的关键数据猜测是fuzz出来的,所以,010editor在解析到SimpleGlyph[10]的数据时报异常,没有显示出来。途中蓝色选中的数据就在这片黑色领域中。
报错信息如下:
010editor报错信息

windbg不用开page heap,因为不是堆溢出。运行poc,查看报错:

eax=65ee622c ebx=00000000 ecx=65eef000 edx=3fffdc8a esi=65eef004 edi=00004141
eip=65cb79ce esp=0016cd9c ebp=0016ce30 iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010202
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for C:\Program Files\Adobe\Reader 9.0\Reader\CoolType.dll - 
CoolType+0x79ce:
65cb79ce 8919            mov     dword ptr [ecx],ebx  ds:0023:65eef000=00000000

写入的目标地址是65eef000

查看内存属性

0:000> !address 65eef000                  
Failed to map Heaps (error 80004005)
Usage:                  Image
Allocation Base:        65cb0000
Base Address:           65eef000
End Address:            65f0f000
Region Size:            00020000
Type:                   01000000	MEM_IMAGE
State:                  00001000	MEM_COMMIT
Protect:                00000002	PAGE_READONLY
More info:              lmv m CoolType
More info:              !lmi CoolType
More info:              ln 0x65eef000

目标地址Protect属性是PAGE_READONLY,表示只读。向只读地址写入数据,估计是写越界了。

回溯函数调用栈

0:000> kb
ChildEBP RetAddr  Args to Child              
WARNING: Stack unwind information not available. Following frames may be wrong.
0016ce30 65cbade0 0c6fcbb8 65ee5a28 0c6fce16 CoolType+0x79ce
0016ce60 65cb4e44 0c6fcbb8 65ee5a28 0c6fce16 CoolType+0xade0
0016cea0 65cb587c 0c6fca38 0c6fcbb8 65ee5a28 CoolType+0x4e44
0016cf44 65cb5c36 05eb6aa4 05eb6bfc 05eb6bb4 CoolType+0x587c
0016cfa0 65cb5cc8 05eb6aa4 05eb6bfc 05eb6bb4 CoolType+0x5c36
0016cff0 65cb3a69 05eb6aa4 05eb6bfc 05eb6bb4 CoolType+0x5cc8
0016d058 65cb3b36 0016d15c 0016d08c 00000001 CoolType+0x3a69
0016d1b8 65ccbb43 098df390 00000000 0016d204 CoolType+0x3b36
00000000 00000000 00000000 00000000 00000000 CoolType+0x1bb43

查看当前函数 CoolType+0x79ce

int __cdecl sub_800798B(int a1)
{unsigned int v1; // edi@2_DWORD *v2; // eax@3int v3; // edx@3unsigned int v4; // ecx@3int v5; // edi@5int result; // eax@8if ( (unsigned int)(dword_82323E0 - 4) < *(_DWORD *)dword_82323EC|| (v1 = *(_DWORD *)(dword_82323EC + 340), dword_82323E0 - 4 >= v1)|| (v2 = (_DWORD *)(dword_82323E0 - 4),v3 = *(_DWORD *)(dword_82323E0 - 4),v4 = dword_82323E0 - 4 - 4 * *(_DWORD *)(dword_82323E0 - 4),v4 < *(_DWORD *)dword_82323EC)|| v4 >= v1 ){result = dword_8232438;dword_8232434 = 4368;}else{v5 = *(_DWORD *)v4;if ( v3 > 0 ){do{--v3;*(_DWORD *)v4 = *(_DWORD *)(v4 + 4); //在此处崩溃v4 += 4;}while ( v3 );--v2;}*v2 = v5;dword_82323E0 = (int)(v2 + 1);result = a1;}return result;
}

该函数是MINDEX指令的实现-size为n的数组做循环左移一位,在内存中找数组边界时,n也就是代码中的v3溢出成超大值,导致写越界。
sub_800798B函数之前已经写了一篇比较详细文章做说明【传送门】。

65cb798b a1e023ee65      mov     eax,dword ptr [CoolType!CTCleanup+0xe3ad6 (65ee23e0)] // 函数入口,这里下断点
65cb7990 8b0dec23ee65    mov     ecx,dword ptr [CoolType!CTCleanup+0xe3ae2 (65ee23ec)]
65cb7996 53              push    ebx
65cb7997 56              push    esi
65cb7998 8b31            mov     esi,dword ptr [ecx]
65cb799a 8d50fc          lea     edx,[eax-4]
65cb799d 3bd6            cmp     edx,esi
65cb799f 57              push    edi
65cb79a0 7245            jb      CoolType+0x79e7 (65cb79e7)
65cb79a2 8bb954010000    mov     edi,dword ptr [ecx+154h]
65cb79a8 3bd7            cmp     edx,edi
65cb79aa 733b            jae     CoolType+0x79e7 (65cb79e7)
65cb79ac 83c0fc          add     eax,0FFFFFFFCh
65cb79af 8b10            mov     edx,dword ptr [eax]
65cb79b1 8bda            mov     ebx,edx
65cb79b3 c1e302          shl     ebx,2
65cb79b6 8bc8            mov     ecx,eax
65cb79b8 2bcb            sub     ecx,ebx
65cb79ba 3bce            cmp     ecx,esi
65cb79bc 7229            jb      CoolType+0x79e7 (65cb79e7)
65cb79be 3bcf            cmp     ecx,edi
65cb79c0 7325            jae     CoolType+0x79e7 (65cb79e7)
65cb79c2 85d2            test    edx,edx
65cb79c4 8b39            mov     edi,dword ptr [ecx]
65cb79c6 7e0f            jle     CoolType+0x79d7 (65cb79d7)
65cb79c8 4a              dec     edx //数组大小n自减,也就是反汇编中的v3自减操作
65cb79c9 8d7104          lea     esi,[ecx+4]
65cb79cc 8b1e            mov     ebx,dword ptr [esi]
65cb79ce 8919            mov     dword ptr [ecx],ebx  ds:0023:65eef000=00000000
65cb79d0 8bce            mov     ecx,esi
65cb79d2 75f4            jne     CoolType+0x79c8 (65cb79c8)
65cb79d4 83e804          sub     eax,4
65cb79d7 8938            mov     dword ptr [eax],edi
65cb79d9 83c004          add     eax,4
65cb79dc a3e023ee65      mov     dword ptr [CoolType!CTCleanup+0xe3ad6 (65ee23e0)],eax
65cb79e1 8b442410        mov     eax,dword ptr [esp+10h]
65cb79e5 eb0f            jmp     CoolType+0x79f6 (65cb79f6)

在函数入口出下断点

0:000>bp 65cb798b

可以看到这个值n在进入sub_800798B函数不久v3改变成0x40000001,并开始do-while循环,有人见过0x40000001这么大的数组吗?显然这是一个bug。

跟进v3变量,在存储地址65ee622c下写断点

0:000> ba w4 65ee622c

追踪到v3的值的计算过程
0x3FFF0003 + 0x7FFF + 0x7FFF = 0x40000001

根据这段输入定位到poc.pdf中的关键数据位置

41 41 41 41 41 41 00 03 00 00 00 40 42 41 02 7F FF 7F FF 63 60 41 04 FF E8 00 00 00 00 00 00 43 B0 01 61 42 43 78 41 02 7F FF 7F FF 60 60

0x04 小结

  1. 能初步定位问题出在glyf表,并通过官方文档理解这段数据的意义很重要;
  2. windbg没有watchpoint,在观测65ee622c地址的数据变化时,只能靠人眼和记忆了,所以泉哥的分析用的Immunity Debugger;
  3. 这种数据是指令集的反汇编代码开始比较难看。在想llvm和jit是不是也会有这样的bug。

0x05 参考文献

http://pwdme.cc/2017/11/05/cve-2012-0774/
https://developer.apple.com/fonts/TrueType-Reference-Manual/RM07/appendixA.html
https://docs.microsoft.com/en-us/typography/opentype/spec/tt_instructions
https://android.googlesource.com/platform/external/freetype/+/f720f0dbcf012d6c984dbbefa0875ef9840458c6/src/truetype/ttinterp.c

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1549551.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

solidity0.8.0的应用案例13:数字签名及应用:NFT白名单

以太坊中的数字签名ECDSA,以及如何利用它发放NFT白名单 代码中的ECDSA库由OpenZeppelin的同名库简化而成。 数字签名 如果你用过opensea交易NFT,对签名就不会陌生。下图是小狐狸(metamask)钱包进行签名时弹出的窗口,它可以证明你拥有私钥的同时不需要对外公布私钥。 …

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

0x00 漏洞概述 2020年11月03日,Adobe发布了关于Adobe Acrobat和Reader的14个安全更新,其中包括多个任意代码执行漏洞。Adobe表示目前还没有发现任何关于这些漏洞的野外攻击事件。 0x01 漏洞详情 Adobe Acrobat和Adobe Reader都是Adobe官方出品的PDF文档解决方案套件。Adobe R…

Adobe Reader 文档无法签名_如何在Mac上使用预览对PDF进行电子签名

当您通过电子邮件收到必须签名的PDF文档时&#xff0c;打印文件&#xff0c;用钢笔在虚线上签名&#xff0c;扫描签名的文档并将其发回的过程可能是一项相当繁琐的任务。幸运的是&#xff0c;苹果公司增加了使用预览功能对PDF文档进行电子签名的功能&#xff0c;该程序预先安装…

adobe reader XI 打开后闪退(或过几秒后自动退出)【终极解决方案】

Adobe Reader 11打开后闪退&#xff08;或过几秒后自动退出&#xff09;【终极解决方案】 win10系统解决2020年2月份Adobe ReaderXI自动关闭问题&#xff1a; &#xff08;以下方法任一种均可&#xff09; 方法一、更新补丁 注意&#xff1a;先请安装11.0.00正式版&#xf…

【地理图库】世界小麦产量分布

声明&#xff1a;来源网络&#xff0c;仅供学习&#xff01;

多肽合成15266-88-3产品特点介绍,Cyclo(glycyl-L-histidyl)

中文名&#xff1a;环(甘氨酰-L-组氨酰) 英文名&#xff1a;cyclo(Gly-His) CYCLO(-GLY-HIS) Cyclo(glycyl-L-histidyl) (S)-3-(1H-Imidazol-4-ylmethyl)-2,5-piperazinedione CAS&#xff1a;15266-88-3 分子式&#xff1a;C8H10N4O2 分子量&#xff1a;194.191 密度 …

Windows运行Spark所需的Hadoop安装

解压文件 复制bin目录 找到winutils-master文件hadoop对应的bin目录版本 全部复制替换掉hadoop的bin目录文件 复制hadoop.dll文件 将bin目录下的hadoop.dll文件复制到System32目录下 配置环境变量 修改hadoop-env.cmd配置文件 注意jdk装在非C盘则完全没问题&#xff0c;如果装在…

郑义宣就任韩国现代汽车集团会长;爱立信携手中国电信运用爱立信频谱共享技术 | 美通企业日报...

今日看点 现代汽车集团(Hyundai Motor Group)宣布&#xff0c;集团首席副会长郑义宣(Euisun Chung)就任集团会长。原集团会长郑梦九(Mong-Koo Chung)将担任集团名誉会长。现代汽车公司、起亚汽车公司(Kia Motors Corporation)和现代摩比斯公司(Hyundai Mobis Co.)分别召开了特别…

互联网快讯:京东公布“双11”节奏;猿辅导、掌门教育布局素质教育

零售电商 1、京东公布“双11”节奏&#xff1a;10月20日晚8点正式开启预售&#xff0c;10月31日晚8点提前开抢 2、达达快送发布即时配送SaaS系统“达达智配”&#xff0c;赋能配送服务商提升行业效能 3、天猫国际加速推进“五新”策略&#xff0c;双11重点孵化40个新品类 4…

怎样启动华为桌面服务器,[图]华为鲲鹏服务器/台式机主板登场:为ARM处理器打开桌面市场大门...

华为官网介绍如下鲲鹏台式机主板是基于华为鲲鹏920处理器开发的办公应用主板&#xff0c;兼容业界主流内存、硬盘、网卡等硬件&#xff0c;支持Linux桌面操作系统&#xff0c;提供机箱、散热、供电等参考设计指南&#xff0c;具有高性能、接口丰富、高可靠性、易用性等特点。 根…

百度超级链捐赠开放原子开源基金会一周年,XuperChain成果一览

摘要 2020年9月9日&#xff0c;开放原子开源基金会正式与百度完成了超级链内核项目捐赠协议的签署&#xff0c;这一捐赠协议意味着百度自主研发的超级链技术将依托于开源基金会以全新的组织形态进行运作。此项目作为开源基金会区块链领域首个捐赠项目进行孵化&#xff0c;并在全…

容联云与20多家银行齐聚,共探客服中心与远程银行建设新业态

以客户为中心、以数字为根底、以科技为驱动的非接触金融服务成为金融新业态。聚焦客户体验提升和价值创造的客服中心和远程银行随之迎来前所未有的发展新机遇&#xff0c;成为金融行业数字化转型的重要突破口。 近日&#xff0c;容联云与金科创新社联合举办2021客服中心与远程银…

区块链、AI遇上艺术,科技突破艺术的想象空间

近期&#xff0c;在中国最高的美术馆——上海云间美术馆&#xff0c;来自人工智能和区块链领域的专家、高校学者和知名艺术家&#xff0c;共同展开了一场关于区块链、人工智能和数字艺术的深度交流&#xff0c;探讨区块链和人工智能赋能数字艺术的新方向。 与会嘉宾认为&#x…

数据生态、数字人民币、5G消息……看2022银行数字化七大趋势

以大数据、人工智能、5G、物联网、区块链等为代表的数字科技&#xff0c;持续驱动银行业数字化发展&#xff0c;各机构借助金融科技降低成本、提升质效、增强用户体验、优化业务模式。 中国电子银行网综合过去一年的行业成果与近期的关键动态&#xff0c;展望2022年银行数字化…

金融×元宇宙:虚实交融共进下的金融体系

近年来&#xff0c;“DeFi”、加密货币等在部分海外国家迅速发展&#xff0c;但也引发了许多争议。部分观点认为伴随元宇宙概念的逐步成熟&#xff0c;或产生以加密货币、“DeFi”为底座、融合去中心化思想的金融体系&#xff0c;也有观点认为加密货币是没有价值的泡沫&#xf…

国家级区块链基础设施BSN推出BSN-DDC以支持部署NFT

摘要 产业动态&#xff1a; 谷歌成立区块链部门&#xff0c;将专注于分布式计算、存储等技术 腾讯最快于月内向日本企业提供元宇宙业务服务 目前暂无公司成功注册“元宇宙”相关商标 政策相关&#xff1a; 央行、公安部等11部门联合开展打击治理洗钱违法犯罪三年行动 北京市广播…

面对10亿用户流量,餐饮商家如何打破运营僵局

面对10亿用户流量,餐饮商家如何打破运营僵局? 2017年1月9日微信小程序发布后,餐饮行业动作频频,麦当劳、肯德基、星巴克、等餐饮大品牌相继加入了小程序的行列。根据微信小程序第三方制作平台即速应用相关数据显示,餐饮类小程序月平均流量以及订单量在8月时出现明显增长,…

数字藏品大开杀戒,如何保护好自己的钱包?

数字藏品打响平台“保卫战” 2021年以来&#xff0c;数字藏品&#xff0c;作为一种新型可确权、可追溯的数字艺术文化消费形式&#xff0c;迅速席卷文创市场&#xff0c;中小型企业、互联网巨头、金融机构、传统上市公司甚至官方机构持续涌入其中&#xff0c;涉及领域之多、入…

TaiShan服务器介绍

TaiShan服务器系列介绍 TaiShan 100服务器2016年 基于Kunpeng916处理器 最多16各DDR4内存 支持5个PCIe 3.0扩展插槽 支持SAS/SATA硬盘和SSD 支持板载GE/10GE网络 TaiShan 200服务器2019年 基于Kunpeng 920处理器 最多支持32个DDR4内存 支持最多8个PCLe 4.0扩展插槽 支持NVMe …