1.本文作者系复眼小组的ERFZE,未经允许禁止转载2.全文一共1800多字,图片38张,预计阅读时间8分钟3.笔者于书写此文之前从未接触过InPage,该文权当笔者于学习过程中的一篇学习笔记,其中如有不当或错误之处,望读者不吝赐教,笔者感激不尽!
0x00前言
笔者于书写此文之前从未接触过InPage
,该文权当笔者于学习过程中的文章学习笔记,其中如有不当或错误之处,望读者不吝赐教,笔者感激不尽。
0x01页内
该介绍引自维基百科
InPage是一种文字处理程序和页面布局软件,最初在1994年开发,适用于Windows和Mac平台下的乌尔都语,Balochi,波斯语,普什图语和阿拉伯语等语言。
笔者复现及分析环境基于InPage 2010:
0x02进攻分析
0x02.1进攻描述
该突破本质是越界读(Out-Of-Bound Read),InPage
在处理文档中的InPage100流时未对需要处理的数据类型(类型)进行有效检查,而该范围可以由攻击者设置一个超出Type
范围的值导致InPage
在处理Type
前后造成越界读。
0x02.2静态分析
由于笔者重新找到可以调试使用的POC
,故直接使用Bitter组织某样作为调试对象。
进攻触发位置位于sub_453590
:
由sub_453700
传递给sub_453590
的参数是读取到的Type
值:
调试之后发现该变量0x7E72
,那么右移8位之后即为0x7E
。然后看看dword_656A28[0x7E]
的赋值(位于sub_4560A0
内):
result = sub_4536A0(0x7Eu, (int)&unk_656E60);
而sub_4536A0
功能如下:
进一步查看unk_656E60
:
可以看到纹理unk_656E60
大小为0x1B
,而4*0x72
明显超过其大小,因此造成越界读。
0x02.3动态调试
笔者调试时采用附加到进展Inpage.exe
之后打开样本文件的方法来调试。设置断点如下:
成功断下:
之后其越界调用0x00455AFA
处指令:
而0x00455AFA
处指令恰好将控制流交到由攻击者构造的数据上:
0x03 Bitter组织某利用样本分析
0x03.1 样本一
样本名称:Court_Notice.inp MD5:303F01E8CE9488CA7C1B265A8768CCE0
该样本的漏洞利用部分已由上节给出,下面直接分析其Shellcode
。通过连续两个0x416E3453
(字符串"An4S")标志进行定位其Shellcode
起始位置:
跳转到Shellcode
之后,先获取PE文件(DLL
文件Backdoor
)起始位置:
获取使用到的函数调用地址:
创建一名为QPONMLKJIH
的互斥对象,并调用GetLastError
检查是否已存在该名称的互斥对象(0xB7,ERROR_ALREADY_EXISTS):
为DLL
文件申请SizeofImage
大小的内存空间:
若申请失败,则修改第一个参数为NULL
,重新申请。
其后将DLL文件加载到内存中并手动完成PE装载器的工作。首先是复制DLL文件头部:
复制.text
区块内容到内存:
之后依次是.rdata
、rsrc
、.reloc
区块,不再一一截图。
接下来对DLL文件进行重定位。检查基址重定位表大小是否为0:
检查IMAGE_BASE_RELOCATION结构大小是否为0:
根据重定位项数组中的重定位数据进行重定位:
修复输入表:
依次更改.text
、.rdata
、rsrc
区块所在内存区域的保护属性:
调用DLL文件中一函数过程:
其功能为创建一新线程:
由此该DLL文件得以执行。
0x03.2 样本二
样本名称:Press_Note.inp
MD5:5DD080B9AD4BC5C58C0CED31829CCADA
该样本与上一样本的利用方法相同,不再占用篇幅。