《漏洞战争》- CVE-2010-2883(下)

复制的内容转换为指令,复制的数据一部分是有意义的shellcode,另一部分为0x0c0c0c0c。

memcpy返回之后,程序直接来到地址3720000处执行复制的指令,通过这种方式可以绕过dep保护。

执行恶意指令过程中

在函数037202f0中,shellcode计算指定api的hash值,推测之后通过hash比较获得特定api的地址,这里将kernel32模块中的导出名称表中的所有函数名称分别计算hash,然后与指定的hash值比较,即[esp+14],用于判断是否寻址到指定的api

第一个寻址到的函数为ExitProcess

将ExitProcess函数的地址保存在eax寄存器中 kernel32的基地址保存到edx中,之后函数返回

返回之后,发现 37202f0函数会被循环调用,从而获得所有shellcode所需的api的地址

获得的api地址依次为

ExitProcess

GlobalFree

GetCommandLineA

WinExec

_hwrite

_lcreate

GetTempPathA

CloseHandle

GlobalAlloc

ReadFile

SetFilePointer

GetFileSize

调用GetFileSize函数,经调试函数返回值为-1,之后返回值会与-1进行比较

循环调用GetFileSize函数

循环调用GetFileSize过程中,对该函数的返回值进行判断,是否为-1、是否大于200,如果返回值大于2000则执行之后的指令,否则继续循环执行GetFileSize    

当文件大小满足指令要求时

这里是根据文件的大小和文件指定位置的数据,寻找满足指定性质的文件

从内存中提取pdf文件

文档内容

通过对文档内容的分析,发现读入内存的pdf文件即为攻击样本文档

读取文件完毕后,关闭文件句柄

之后修改攻击样本文档在内存中的数据,从高地址到低地址修改数据,并且一次修改一个字节

当eax为0时循环结束

比较内存中文件数据被修改前后的区别,通过文件对比,发现文件中间大部被修改,首尾部分数据没有被修改

调用函数获取临时文件的指定路径

之后的调试过程中,由于中间重新运行了调试器,而且存放恶意代码的内存空间是动态申请的,故之后的分析恶意代码起始地址为0x036d0000

指定路径创建文件svrhost.exe

向文件中写入数据

GetCommandLine用于获得当前进程命令行字符串

经分析第二次写入内存的pdf文件是有关企业面试的资料,与攻击文档名称相关,推测程序开始释放真实的文档内容

_lcreate函数返回值为-1,疑似创建进程失败

当创建pdf阅读器进程成功时。(此时被执行的恶意代码基址为3670000)

如果将closehandle去掉,继续观察后面的指令执行

针对shellcode释放的恶意文件svrhost.exe的分析可以参考漏洞战争一书中的内容

猜你喜欢

转载自www.cnblogs.com/hell--world/p/11552312.html