佚名 向大家分享了CVE公共漏洞和暴露分析报告2012-0774,其中包含cve漏洞,cve中文漏洞信息库,cve漏洞库,cve漏洞2016-8735,cve 2017-0199漏洞等知识点,遇到此问题的同学们可以参考下
一.漏洞描述
Adobe Reader在阅读PDF文件时使用一些公共格式载入字体说明,比如TrueTypeFont (TTF).<TTF是Apple公司和Microsoft公司共同推出的字体文件格式>
TTF中有几个片段负责格式化存储字体字形的描述,其中一个片段是字节码语言,它由TTF渲染器中的一个解释器执行。这个解释器是一个基于堆栈的虚拟机,因此它使用的大部分指令都以某种方式修改指令。MINDEX指令可以从栈中弹出一个值,并利用这个值作为一个索引进入栈区。该索引上的值被移到栈顶,栈中原有的值依次向下移动以填补移动索引值产生的空间。
MINDEX 指令的伪码:
index = stack.pop()
new_top = stack[index]
for (i = 1; i<= index; i++)
stack[i] = stack[i - 1]
stack[0] = new_top
由于所有的栈操作都以4byte为单位,故而该索引值为了找到用于移动的位偏移值,会在Adobe Reader的解释器里进行乘以4的运算。但却没有对这个乘法运算进行整数溢出的检测。这个“索引”的原始值作为一个数字元素复制到一个循环中,如果这个“索引”足够大的(在进行乘4运算时能溢出一个小数值的)数值时,会导致缓冲区溢出。
1.补充
在解析文件时,首先查看“PDF key /FontFile2”可能会获得TTF数据。
找到TTF数据段后,需要对其进行解析,并检查“glyf”表,每个字形条目都可以包含0个或多个TTF字节码格式的指令,需要对他们进行解码和模拟,一次来发现MINDEX指令。
找到MINDEX指令后,需要检查位于栈顶的值(将被用做索引),如果这个值位于下列范围:0x40000001 <= index <= 0x7fffffff ,那么这个PDF文件应标记为恶意的PDF文件。
二、 调试环境与工具
环境:Windows XP3 + AdobeReader9.4.0.195
工具:OllbDBG + IDA Pro + 010 Editer
三、 调试记录
载入POC后程序出现内存访问异常:
080079CE MOV DWORD PTR DS:[ECX],EBX ;ECX=0823F000,EBX=0

ALT+M查看内存窗口,发现程序尝试是向CoolType.dll的.rscr段写入数据,而.rscr段内存一般都只读的,在执行MOV DWORD PTR DS:[ECX],EBX发生了内存访问异常。

按MAPP的描述,发生异常的位置在MINDEX 指令处,载入IDA看看这段代码:
回头再看看图1中的EDX,EDX是一个很大的值,而字节码解释器的堆栈位于CoolType.dll的.dada内存中。MINDEX 指令处在取栈最上面的索引值后,跟据索引值计算出偏移量去取值后,堆中的元素向下移动去填补取出值的位置(堆的增长方向是向高地址与windows程序中的堆栈不同),即高地址的4个字节复制到相邻的低地址的4个字节,如果这个栈中的索引没有验证大小,MINDEX 指令在移动数据直到索引值为0才停下,如果在移动过程中覆盖到重要的数据,此漏洞可变为可利用的漏洞。
.text:0800798B MINDEX proc near ; CODE XREF: sub_800690E+49p
.text:0800798B ; sub_806C605+48p
.text:0800798B ; DATA XREF: .data:0821BF68o
.text:0800798B
.text:0800798B arg_0 = dwordptr 4
.text:0800798B
.text:0800798B moveax, StackTop
.text:08007990 movecx, Var
.text:08007996 push ebx
.text:08007997 push esi
.text:08007998 movesi, [ecx] ; stack.base
.text:0800799A lea edx, [eax-4]
.text:0800799D cmpedx, esi ; 弹出一个值后的堆栈地址是否大于或栈基
.text:0800799F push edi
.text:080079A0 jb short FailRet
.text:080079A0
.text:080079A2 movedi, [ecx+154h] ; Stack.Limit?
.text:080079A8 cmpedx, edi ; 栈顶是否大于stack.limit
.text:080079AA jnb short FailRet
.text:080079AA
.text:080079AC add eax, 0FFFFFFFCh ; -4
.text:080079AF movedx, [eax] ; 取索引
.text:080079B1 movebx, edx
.text:080079B3 shlebx, 2 ; 计算出偏移量,偏移量=索引*4
.text:080079B6 movecx, eax
.text:080079B8 sub ecx, ebx ;ebx=偏移量
.text:080079BA cmpecx, esi
.text:080079BC jb short FailRet
.text:080079BC
.text:080079BE cmpecx, edi
.text:080079C0 jnb short FailRet
.text:080079C0
.text:080079C2 test edx, edx
.text:080079C4 movedi, [ecx] ; 保存取出的值。
.text:080079C6 jle short loc_80079D7
.text:080079C6
.text:080079C8
.text:080079C8 Moving: ; CODE XREF: MINDEX+47j
.text:080079C8 &nbs
Adobe Reader在阅读PDF文件时使用一些公共格式载入字体说明,比如TrueTypeFont (TTF).<TTF是Apple公司和Microsoft公司共同推出的字体文件格式>
TTF中有几个片段负责格式化存储字体字形的描述,其中一个片段是字节码语言,它由TTF渲染器中的一个解释器执行。这个解释器是一个基于堆栈的虚拟机,因此它使用的大部分指令都以某种方式修改指令。MINDEX指令可以从栈中弹出一个值,并利用这个值作为一个索引进入栈区。该索引上的值被移到栈顶,栈中原有的值依次向下移动以填补移动索引值产生的空间。
MINDEX 指令的伪码:
index = stack.pop()
new_top = stack[index]
for (i = 1; i<= index; i++)
stack[i] = stack[i - 1]
stack[0] = new_top
由于所有的栈操作都以4byte为单位,故而该索引值为了找到用于移动的位偏移值,会在Adobe Reader的解释器里进行乘以4的运算。但却没有对这个乘法运算进行整数溢出的检测。这个“索引”的原始值作为一个数字元素复制到一个循环中,如果这个“索引”足够大的(在进行乘4运算时能溢出一个小数值的)数值时,会导致缓冲区溢出。
1.补充
在解析文件时,首先查看“PDF key /FontFile2”可能会获得TTF数据。
找到TTF数据段后,需要对其进行解析,并检查“glyf”表,每个字形条目都可以包含0个或多个TTF字节码格式的指令,需要对他们进行解码和模拟,一次来发现MINDEX指令。
找到MINDEX指令后,需要检查位于栈顶的值(将被用做索引),如果这个值位于下列范围:0x40000001 <= index <= 0x7fffffff ,那么这个PDF文件应标记为恶意的PDF文件。
二、 调试环境与工具
环境:Windows XP3 + AdobeReader9.4.0.195
工具:OllbDBG + IDA Pro + 010 Editer
三、 调试记录
载入POC后程序出现内存访问异常:
080079CE MOV DWORD PTR DS:[ECX],EBX ;ECX=0823F000,EBX=0

ALT+M查看内存窗口,发现程序尝试是向CoolType.dll的.rscr段写入数据,而.rscr段内存一般都只读的,在执行MOV DWORD PTR DS:[ECX],EBX发生了内存访问异常。

按MAPP的描述,发生异常的位置在MINDEX 指令处,载入IDA看看这段代码:
回头再看看图1中的EDX,EDX是一个很大的值,而字节码解释器的堆栈位于CoolType.dll的.dada内存中。MINDEX 指令处在取栈最上面的索引值后,跟据索引值计算出偏移量去取值后,堆中的元素向下移动去填补取出值的位置(堆的增长方向是向高地址与windows程序中的堆栈不同),即高地址的4个字节复制到相邻的低地址的4个字节,如果这个栈中的索引没有验证大小,MINDEX 指令在移动数据直到索引值为0才停下,如果在移动过程中覆盖到重要的数据,此漏洞可变为可利用的漏洞。
.text:0800798B MINDEX proc near ; CODE XREF: sub_800690E+49p
.text:0800798B ; sub_806C605+48p
.text:0800798B ; DATA XREF: .data:0821BF68o
.text:0800798B
.text:0800798B arg_0 = dwordptr 4
.text:0800798B
.text:0800798B moveax, StackTop
.text:08007990 movecx, Var
.text:08007996 push ebx
.text:08007997 push esi
.text:08007998 movesi, [ecx] ; stack.base
.text:0800799A lea edx, [eax-4]
.text:0800799D cmpedx, esi ; 弹出一个值后的堆栈地址是否大于或栈基
.text:0800799F push edi
.text:080079A0 jb short FailRet
.text:080079A0
.text:080079A2 movedi, [ecx+154h] ; Stack.Limit?
.text:080079A8 cmpedx, edi ; 栈顶是否大于stack.limit
.text:080079AA jnb short FailRet
.text:080079AA
.text:080079AC add eax, 0FFFFFFFCh ; -4
.text:080079AF movedx, [eax] ; 取索引
.text:080079B1 movebx, edx
.text:080079B3 shlebx, 2 ; 计算出偏移量,偏移量=索引*4
.text:080079B6 movecx, eax
.text:080079B8 sub ecx, ebx ;ebx=偏移量
.text:080079BA cmpecx, esi
.text:080079BC jb short FailRet
.text:080079BC
.text:080079BE cmpecx, edi
.text:080079C0 jnb short FailRet
.text:080079C0
.text:080079C2 test edx, edx
.text:080079C4 movedi, [ecx] ; 保存取出的值。
.text:080079C6 jle short loc_80079D7
.text:080079C6
.text:080079C8
.text:080079C8 Moving: ; CODE XREF: MINDEX+47j
.text:080079C8 &nbs

