恶意代码分析实战15-2
Posted Neil-Yale
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了恶意代码分析实战15-2相关的知识,希望对你有一定的参考价值。
本次实验我们将会分析lab15-02.exe文件。先来看看要求解答的问题
Q1.程序初始化请求的URL是什么?
Q2. User-Agent 域是如何产生的?
Q3.初始化请求时,程序在内存页中查找什么?
Q4.程序如何处理它从页中提取的信息?
首先IDA载入分析,从头到尾稍微看下main
在0040115a遇到了第一个对抗反汇编技术
因为esp值是非0的,所以test指令返回结果一定是非零值
那么下面的jnz指令的跳转是永远成立的
其跳转的目的是40015e+1
也就是jmp指令中间的位置,这是有问题的,而且IDA将跳转的位置标记为红色,也能说明这里是不正常的
将光标定位40115e,按d键,将这个指令变为数据
然后光标定位到40115f,按c键转为代码
这样就正常了。
继续往下,在4011d0看到了对抗反汇编的技术
这里通过xor给eax赋0,下面的jz指令跳转是永远成立的
jz的目的第4011d4处的call目的地址同样是红色的,说明也是不正常的
光标定位到4011d4,按d键转数据
然后定位到4011d5,按c键转代码
之后都是同样的处理,结果如下
继续往下,在401215处也存在对抗反汇编的技术
可以option->general如下设置,用于显示出机器码
如下所示
这是一个双字节的jmp指令。跳转目标是它的第二个字节
按d键转为数据
光标定位到00401216,按c键转为代码
继续往下,在401269处存在对抗反汇编技术
这里的jz和jnz指令都是跳转到同一个地址,说明命中目标代码不取决于零标志位的置位与否
将光标定位到跳转的目标,也就是0040126d,按d键转为数据
光标定位0040126e,按c键,转为代码
继续往下,在4012e6位置存在对抗反汇编技术
这里的jz跳转的目的地是4012e8,是向上跳转,跳到mov指令中间的位置。这不是正常的跳转,而且和我们之前看到的向下跳转也是不同的
光标定位到4012ee,按d键转为数据
定位到4012ef,按c键转为代码
定位到4012e6,按d键转为数据
定位到4012e8按c键转为代码
至此,main函数中所有对抗反汇编的地方都被我们调整回来了。
不过可以看到,还存在一些多余的db字节,我们需要将其转换为nop指令(0x90),这样才能构造出一个函数
替换nop,使用脚本就可以自动化进行
脚本内容如下
注意文件后缀名为idc
来测试一下,定位到0040115e,这里有多余的db字节
然后file->script file
选中test.idc,点击打开即可
此时已经被修改为90h了
其他地方也是同样如此
这样就全部修改完毕了,接着选中全部main函数
从00401000到0040130e
然后按p键,再按空格键,就可以图形化地查看生成的函数
在InternetOpenUrlA前调用了sub_401386,跟入
可以看到是在将字符拷贝到栈空间里
可以将这些16进制通过按r键进行转换为字符
可以看到往栈上拷贝的字符组成的字符串其实是一个网址
http://practicalmalwareanalysis.com/bamboo.html
Q1.程序初始化请求的URL是什么?
A1.程序第一个请求的URL是http://www.practicalmalwareanalysis.com/bamboo.html。
返回上层函数
我们就知道了InternetOpenUrlA就是尝试访问这个网站
为了知道user-agent,我们来分析InternetOpenA
其第一个参数lpszAgent其实就是user-agent
其值edx来自name,往上回溯
可以看到是gethostname的返回值保存在name中。
所以我们可以认为user-agent的字符串就是主机名
我们f5查看伪码继续分析
将case里的数字转为字符,更直观一点
可以看到是一个for循环。For循环的作用就是将name字符串中的每个字符进行修改:如果是Z则修改为A,如果是z则修改为a,如果是9则修改为0,如果不是这三种情况,则自增,检查下一个
Q2. User-Agent 域是如何产生的?
A2. User-Agent 字符串由hostname中每个字母和数字加1组成(Z和9对应的是A和0)。
程序使用InternetOpen初始化,然后使用InternetOpenUrlA打开一个网址
然后是InternetReadFile将数据下载到一个本地缓冲区
缓冲区包含的数据时第二个参数,上图中已经被IDA标记为Buffer
在004011DA又出现了Buffer
上图中调用了strstr查找一个大字符串中的子串,这里就是在缓冲区Buffer中查找字符串Bamboo::,Buffer里包含从原始的url中提取的所有数据。如果查找成功,则eax会保存该子串在Buffer里首次出现的位置,通过mov指令赋给了Str
Q3.初始化请求时,程序在内存页中查找什么?
A3.程序在它请求的网页中查找字符串Bamboo::。
上图又是调用了strstr。,用来搜索::,如果找到了,则将地址保存在eax里,而00401212又将0赋给了eax
其实也就是说将::的第一个:赋0,或者说赋NULL,用于终止Bamboo::和::之间的字符串
0040123e,ecx+8,其实就是Str+8,而Bamboo::长度就是8,那么这里的作用就是让指针跳过Bamboo::,指向后面的内容
之后是调用InternetOpenUrlA,其第二个参数就是要打开的url
所以我们就知道了,Bamboo::和尾部冒号之间的数据的目的,就是程序要下载的一个网址
调用InternetReadFile将文件保存在文件里
文件名称保存在ecx,而ecx来自于Filename,往上回溯
Filename来自eax,而eax是sub_40130f的返回值
跟入该函数
同样有拷贝字符的操作,按r键转换
这里合在一起就是Account Summary.xls.exe
这就是文件名称,我们通过InterReadFile下载的文件就是保存在这里
回到上层函数,继续往下分析
调用ShellExecute函数启动文件
之后程序就退出了。
Q4.程序如何处理它从页中提取的信息?
A4. 除了搜索字符串Bamboo: :外,程序还查找一个额外的::,它被转换为一个NULL结束符。Bamboo与结束符之间的字符串被下载到一个名为Account Summary.xls.exe的文件中,下载完后, 程序运行它
参考:
1.《恶意代码分析实战》
以上是关于恶意代码分析实战15-2的主要内容,如果未能解决你的问题,请参考以下文章