问题
首先用PEID查看一下Lab07-03.exe的导入表信息。
在这里我们发现了CreateFileA、CreateFileMappingA以及MapViewOfFile,说明这个程序很可能会打开一个文件,并将其映射到内存中。而FindFirstFileA以及FindNextFileA函数,说明这个程序会在计算机中搜索文件或目录。CopyFileA说明这个程序会进行文件的拷贝。
打开ida,查看一下字符串。
我们可以看到,两个非常相像的字符串“kerne132.dll”以及“kernel32.dll”。我们可以猜测这个程序会在C:\windows\system32目录下创建一个kerne132.dll文件。
接下来可以利用ida来检查一下Lab07-03.dll这个文件:
这里出现了一个IP地址,说明这个恶意程序很可能会连接到这个地址。
同时,查看一下导出函数,可以发现,在ws2_32.dll中发现了通过网络发送和接收数据所需要的所有函数。并且在kernel32.dll中,发现这里出现了与互斥量相关的函数,还有一个CreateProcessA函数,说明它很可能会创建一个进程。
分析DLL:
我们首先来到DllMain的位置,打开FunctionsCallView,通过查看函数调用来阅读代码。
第一个调用的是库函数__alloca_probe,用于分配空间。接着调用的是OpenMutexA与CreateMutexA,主要用于保证在同一时间只有这个恶意程序的一个实例在运行。接下来的一系列函数运用的socket套接字来建立远程的连接,并且要传输与接收数据。这个函数最终会调用Sleep或者CreateProcess。在这里我们并不知道什么传输了哪些数据或者创建了哪些进程,但是依据上面的分析可以猜测这个dll的功能。由于它发送并且接收了数据,并且还创建了进程,那么对于它的功能的最好的解释就是它被设计用来从一个远程计算机接收命令。
可以看到在connect的上方,有一个inet_addr的函数调用,它使用了固定的IP地址“127.26.152.13”,说明程序会尝试连接到这个地址。
接下来可以看到在send的上方有一个buf,这个参数保存的就是将要通过网络发送的数据,并且ida也已经识别出,这个位置的字符串是“hello”。
接下来是一个recv函数的调用,然后调用了strncmp函数,用于比较收到的5个字符是不是“sleep”,如果是的话,执行sleep函数休眠60秒。比对4个字符,判定接收到的是不是“exec”,如果是,那么就会调用接下来的CreateProcess函数,通过lpCommandLine这个参数可以知道要创建的进程,我们发现了CommandLine的定义是0FFBh,这说明它会接收缓冲区中保存的任意5字节的东西。所以从远程服务器中接受到的字符串是exec FullPathOfProgramToRun。它会用FullPathOfProgramToRun来调用CreateProcessA。可以知道这个dll程序实现了后门功能,允许攻击者发送消息来启动本地系统上的可执行文件。
分析EXE:
打开ida。
可以看到,程序首先会对main函数中的第一个参数argc的值进行判定,如果这个值不等于2,那么程序就会退出。接着程序会将argv[1],也就是第二个参数具体的内容赋给eax,并将一段字符串赋给esi。接下来程序就会将eax以及esi中的内容进行比较,如果二者不同,那么程序就会退出,相同的情况下,才会继续执行。也就是说,为了使这个程序得到完整的执行,我们需要在命令提示符中输入以下代码:
1 | Lab07-03.exe WARNING_THIS_WILL_DESTROY_YOUR_MACHINE |
在IDA中可以看到,出现了一系列的CreateFile、CreateFileMapping以及MapViewOfFile的调用,分别将系统中的kernel32.dll以及恶意程序Lab07-03.dll映射到内存中。
接下来程序接连调用了sub_401040以及sub_401070。这些函数相对较短且没有相互调用。这些函数在比较内存,计算偏移,或者写入内存。我们暂且跳过。
可以看到这里调用了CloseHandle函数用于句柄的关闭,说明此时程序已经完成了两个文件在内存中的相关操作。然后调用了CopyFile函数,将Lab07-03.dll改为“kerne132.dll”并复制到system32目录中。
接下来出现了一个函数调用,并且使用“C:*”作为它的参数。我们可以双击进入这个sub_4011E0进行分析:
首先可以看到,这个函数的第一个参数被IDA标记为了lpFileName,它可能是一个文件名,因为接下来它被作为参数赋给了文件查找函数FindFirstFileA,这里是要搜索整个C盘目录。
这里出现了stricmp函数,用于比较两个字符串,而且不区分大小写。这里是在将字符串Str1和“.exe”进行比较,如果匹配成功,那么就执行sub_4010A0处的函数。那么很明显,这个程序其实就是在搜索C盘中的所有.exe程序,并且如果找到exe程序,那么就调用sub_4010A0来进行下一步的操作。
下面我们可以进入这个函数分析。
在这个函数中,我们看到它调用了CreateFile、CreateFileMapping以及MapViewOfFile来将找到的exe程序映射到内存中。接下来还有很多IsBadReadPtr函数,用来检查进程是否有权限访问指定的内存块。接下来可以看到一个stricmp函数,代码如下:
这里是将Str1和“kernel32.dll”进行比较。如果能够匹配,下面就出现了repne scasb以及rep movsd指令,这两个指令等价于strlen以及memcpy这两个函数。后者会将esi中的内容覆盖到edi中。这里可以看到,esi中的内容是dword_403010,而edi中的内容是stricmp的Str1参数的内容。
这里我们可以知道这个恶意程序其实会查找C盘中的所有exe程序,将这些程序的导入表中的kernel32.dll修改为kerne132.dll,这样一来,每当这些exe程序运行的时候,就会自动加载恶意DLL程序,实现后门的功能。
1、这个程序如何完成持久化驻留,来确保在计算机被重启后它能继续运行?
这个程序通过复制一个恶意dll文件到C:\Windows\System32目录,并修改C盘中的所有导入kernel32.dll的Exe程序,让这些程序导入该恶意dll程序,从而达到持久化的驻留。
2、这个恶意代码的两个明显的基于主机特征是什么?
一个是经过伪造的文件“kern132.dll”,另一个是名为SADFHUHF的互斥量。
3、这个程序的目的是什么?
这个程序的目的是创建一个难以删除的后门,来连接一个远程主机。这个后门一共有两个命令,一个用于执行指令创建进程,一个用来休眠。
4、一旦这个恶意代码被安装,你如何移除它?
这个程序很难被删除,因为它会感染C盘中的所有exe文件。最好的办法是写一个程序,用于修改所有被感染的文件,将它们导入表中伪造的dll文件名修改为真实的dll文件名称。