恶意代码分析实战21-1

Posted Neil-Yale

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了恶意代码分析实战21-1相关的知识,希望对你有一定的参考价值。

本次实验我们将会分析lab21-01文件。先来看看要求解答的问题
A1.当你不带任何参数运行程序时会发生什么?
A2.根据你使用的IDAPro的版本,main函数可能没有被自动识别,你如何识别对main函数的调用?
A3.从00000000140001 150地址到0x000000140001161地址的指令在栈上存储了什么?
A4.在不改变二进制程序文件名的前提下,如何才能让这个程序运行它的真正负载?
A5.0x000000140001205 位置的strncmp函数调用比较了哪两个字符 串?
A6.0x00000001400013C8 位置的函数接收哪些参数?
A7.有多少个参数被传递给在0x000000140001093位置对CreateProcess函数的调用?你是如何知道的?

直接这个运行,会立即退出
A1.当你不带任何参数运行程序时会发生什么?
Q1.当你运行这个程序却没带任何参数,它会立即退出

IDA载入
自动停在了main函数
在这里插入图片描述

如果没有自动识别的话会自动停在入口点,我们就需要手动找出main
手动的流程是这样的:
首先跳到入口点140001750
在这里插入图片描述

这是pe头部中的入口点
上图中的call很明显不是,那么跟入jmp
找到了main
在这里插入图片描述

我们知道main函数接收三个参数:argc,argv,envp,其中argc是32位整数值,argv和envp是64位
A2.根据你使用的IDAPro的版本,main函数可能没有被自动识别,你如何识别对main函数的调用?
Q2. main函数位于0x0000001400010C0处。你可以通过寻找接受-一个整数与两个指针作为输入参数的函数调用定位main函数。

找到main函数之后我们继续分析
在这里插入图片描述

大量数据被移动到栈上
可以在IDA中如下转换
在这里插入图片描述

可以看到这是将ocl.exe存储到栈上
A3.从00000000140001 150地址到0x000000140001161地址的指令在栈上存储了什么?
Q3.字符串ocl.exe存储在栈中。
那么我们尝试将文件名称修改为ocl.exe,可是还是不能正常运行
继续分析
在这里插入图片描述

调用了strrchr,用于获得可执行文件的文件名,而不包含前面的目录路径
在这里插入图片描述

这里有一个循环,似乎是一个编码函数
在这里插入图片描述

调用了strncmp
看看它比较的内容
str1往上回溯
在这里插入图片描述

可知是经过编码后得到的字符串
str2往上回溯
在这里插入图片描述

可以看到是正在执行的恶意代码文件名

如果要继续执行的话则要确保strncmp返回0,否则就会往右边走
在这里插入图片描述

结束运行
Q4.在不改变二进制程序文件名的前提下,如何才能让这个程序运行它的真正负载?
A4.为了不修改可执行程序的文件名就能让这个程序运行有效载荷,你需要patch在0x000000140001213处的jump指令,将其替换为NOP指令。
接下来我们要找出恶意代码在搜索什么字符串
可以使用windbg调试分析
在strncmp处下断点,地址是0000000140001205
我们先使用u命令来验证该位置的指令
在这里插入图片描述

这些指令和我们在IDA中看到的是一样的
然后下断点,执行
在这里插入图片描述

查看rcx寄存器内容,因为该寄存器保存的就是编码后的字符串
在这里插入图片描述

可以看到,正在进行比较的字符串是jzm.exe
Q5.0x000000140001205 位置的strncmp函数调用比较了哪两个字符串?
A5.可执行文件的名字会通过调用在0000000140001205 位置的strncmp 函数与字符串jzm.exe进行比较。
回到IDA继续分析
在这里插入图片描述在这里插入图片描述

从这些函数的调用中可以知道,程序正在连接到一个远程套接字上
在这里插入图片描述

在1400013bd处,rbx赋给rcx
往上回溯rbx
在这里插入图片描述

可见rbx存储的是WSASocket函数返回的套接字
A6.0x00000001400013C8 位置的函数接收哪些参数?
Q6.在0x00000001400013C8地址的函数只需要一个参数,其中包含了创建的远程主机套接字。
跟入sub_140001000
在这里插入图片描述

调用了CreateProcessA
其参数都是通过mov移动到栈上,而不是push压栈。这样子要分析函数调用就比32位的复杂一些。因为不是所有的mov都表示将参数移入栈上。
比如14000104b处的mov操作的是CreateProcessA函数的参数LPSTARTINFO,而STARTINFO结构也被存储在栈上,从var_78开始。在14000107b到14000108b的三条指令是将一些值移入STARTUPINFO,这个结构刚好使存储在栈上,但是不是CreateProcessA的参数。因为函数参数与其他栈行为的复杂交织,我们很难通过仅查看函数调用来搞清楚具体的传参行为。这种情况下,我们查阅MSDN可知,CreateProcessA需要10个参数。
A7.有多少个参数被传递给在0x000000140001093位置对CreateProcess函数的调用?你是如何知道的?
Q7.调用CreateProcess函数需要10个参数。我们无法从IDA Pro的列表中获取这些参数,因为我们不能区分存储在栈上与用于函数调用的变量,但这个函数在MSDN中拥有使用文档,始终需要10个参数。

参考:
1.《恶意代码分析实战》

以上是关于恶意代码分析实战21-1的主要内容,如果未能解决你的问题,请参考以下文章

恶意代码分析实战3-2

恶意代码分析实战11-1

恶意代码分析实战9-1

恶意代码分析实战14-02

恶意代码分析实战11-2

恶意代码分析实战15-3