恶意代码分析实战6-2
Posted Neil-Yale
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了恶意代码分析实战6-2相关的知识,希望对你有一定的参考价值。
本次实验分析lab06-02.exe.需要回答以下问题
Q1main函数调用的第一个子过程执行了什么操作
Q2位于0x40117f的子过程是什么
Q3被main函数调用的第二个子过程做了什么
Q4在这个子过程中使用了什么类型的代码结构
Q5在这个程序中有任何基于网络的暗示吗
Q6这个恶意代码的目的是什么
先静态分析。将实验文件载入peview,查看其导入函数
最下面这些internet开头的函数都是WinINet的一部分,这个库提供了通过网络使用http的一组简单的api
InternetOpenA:用于初始化对wininet库的使用,并设置用于http通信的user-agent字段
InternetOpenUrlA:使用一个完整的ftp 或http的url,来打开一个句柄(程序使用句柄来访问已经打开的一些东西)
InternetReadFile:用于从InternetOpenUrlA打开的句柄中读取数据
InterCloseHandle:用于关闭已打开文件的句柄
然后从查看字符串
看到了fail to get command,url等信息。这个url就可以作为网络特征之一。
我们推测这个程序可能会打开一个网页,并解析一条指令。
接下来尝试使用wireshark监听流量
wireshark开启监听后,打开文件,如下图所示
可以看到dns请求查询恶意网址
我这台winxp上的是ie6
但是在抓到的流浪中看到,使用get请求恶意网址时,该文件该伪造了user-agent
Q5在这个程序中有任何基于网络的暗示吗
A5.有两条网络特征。该程序使用Internet Explorer 7.5/pma 作为HTTP的User-Agent字段,并从http://www.practicalmalwareanalysis.com/cc.htm下载了网页。
。
接下来载入ida分析
main函数一个次调用是sub_401000
跟入
与我们之前分析的lab6-1.exe是一样的,不再分析了
Q1main函数调用的第一个子过程执行了什么操作
A1.位于0x401000的第-一个子例程与Lab6-1一样,是一个if语句,检查是否存在可用的Internet连接。
Q2位于0x40117f的子过程是什么
根据问题2,看sub_40117f,
在其附近可以看到有两个push压栈操作
跟入后可以看到
确实是传入两个参数
一个是格式化字符串success。。。。
另一个是ecx,往上看
是401148的调用返回字符
因为字符串后面有%c,所以可知这是格式化字符串,因此我们推断40117f调用了printf,可以给它重命名
光标定位到40117f,按n
修改如上,点击ok即可
A2.位于0x40117F的子例程是printf
printf会把success处的%c替换成另一个压入栈的参数
Q3,Q4,Q6我们做完下面的实验一起解答
main函数调用的第二个子过程为sub_401040
跟入后可以看到
里面都是我们静态分析时发现的wininet api的调用。
具体来看
首先是Internetopen,用于初始化对wininet库的使用
注意这里压栈了之前在wireshark中看到的那个user-agent
然后是internetopenurl,来打开位于压入栈参数的静态网页,也就是www.practice……
可以看到internetopenurla的返回结果赋给了hfile
并通过cmp指令与0比较,如果不等于0则跳到loc_40109d,也就是走左边的分支,hfile就这样传给了internetreadfile。可以看到,这里的hfile就是一个用于访问url的句柄
internetreadfile用于从internetopenurla打开的网页中读取内容
从文档中知道:https://docs.microsoft.com/en-us/windows/win32/api/wininet/nf-wininet-internetreadfile
对照着ida的返汇编结果,我们知道第二个参数为接收数据的buffer,而在ida中也将其标记为buffer
由Push 200h可知,会读取0x200字节的内容,也就是buffer为0x200大小,即10进制的512
既然ida没有识别出来,我们可以自己设置
在任意处ctrl+k
在buffer这边右键->数组
设置为512
点击ok即可
cmp用于比较返回值是否为0
如果为0,则关闭句柄并终止
如果不为0,则跳到loc_4010e5
如上图所示,可知,代码会将buffer每次逐一与一个字符比较,每次比较时buffer数组的索引值加1
最开始是cmp ecx,3ch
检查第一个字符是否等于0x3c
在0x3c处右键可以将其改为<
对于后面的也是同理
可以看到就是比较buffer前4字节是否为<!—
这串字符是html的注释开始部分
如果其中有一处比较不成功,则会跳到loc_40111d
全成功则会执行mov al,[ebp+buffer+4],作用是buffer第5个字符会移到al中,并从这个函数返回
回到main函数
如果401040返回非零值,则jnz跳到loc_40115c,打印success,,字符串中的%c会被处理为函数读取的buffer的第五个字符
后面是调用sleep
参数为0ea60h,即10进制的60000ms
那么程序为什么会这么写呢?
我们来理一下。程序首先检查是否有一个可用的internet连接,然后下载一个包含了<!—的网页,由于这是html注释的开头部分,在浏览器中不会被显示,但是恶意软件可以读取到命令,但是在正常人观察来看,恶意代码只是在访问一个网页,而不是在接收攻击者发给它的指令。
Q3被main函数调用的第二个子过程做了什么
Q4在这个子过程中使用了什么类型的代码结构
Q6这个恶意代码的目的是什么
A3. main 调用的第二个函数位于0x401040,它下载位于http://www.practicalmalwareanalysis.com/ cc.htm的网页,并从页面开始处解析HTML注释。
A4.该子例程调用InternetReadFile,将返回的数据填充到一个字符数组中,然后每次一个字节地对这个数组进行比较,以解析一个HTML注释。
A6.程序首先判断是否存在一个可用的Internet 连接,如果不存在就终止运行。否则,程序使用一个独特的用户代理尝试下载一个网页。该网页包含了一段由<!–开始的HTML注释,程序解析其后的那个字符并输出到屏幕,输出格式是“Success:ParsedcommandisX",其中X就是从该HTML注释中解析出来的字符。如果解析成功,程序会休眠1分钟,然后终止运行
。
参考:
1.《恶意代码分析实战》
以上是关于恶意代码分析实战6-2的主要内容,如果未能解决你的问题,请参考以下文章