1、问题
首先用strings.exe载入Lab09-02.exe,查看一下字符串。
可以看到一系列的导入函数以及cmd这个字符串。
接下来用IDA和OD将这个程序载入进行分析。根据IAD的main函数地址0x00401128,令OD跳转到mian函数的位置,下个断点,运行到这里。
可以看到这段代码出现了一串mov指令将一系列字节压栈。利用IDA直接将这些字节转换。
在OD中运行并跟踪这个栈空间。
接下来调用了GetModuleFileNameA这个函数,用于获得当前运行程序的完整路径。然后又调用了Lab09-02.00401550这个函数,在IDA中我们可以看到,这个函数被解析为_strrchr,并且将刚刚获取到的文件路径以及“\”作为函数参数压栈。这个函数用于获取当前的文件名称。接下来调用了_strcmp这个函数,将ocl.exe与Lab09-02.exe这两个字符串进行比较。
如果不相等,就结束程序。综合来看,为了让程序能够正常运行,我们应该将文件名该文ocl.exe。
将文件名修改后,程序可以成功执行,接下来调用了与套接字相关的函数,然后调用了sub_401089这个函数。我们在OD中直接跳转到这个函数。
通过观察栈空间中的内容可以知道,这个函数的一个参数就是最开始拷贝到栈上的“1qaz2wsx3edc”这段字符串,另一个参数是一个数据缓冲区,其中的内容目前还不能够识别。
接下来在IDA中进入这个函数,可以发现这是一个循环操作。按下F5键,将汇编代码转换为C语言代码。
通过分析可以看出,这段代码对压入的字符串“1qaz2wsx3edc”进行了一个异或操作,应该是解密的过程。我们在OD中0x0040110C位置下一个断点,然后按F9运行,对异或后的数据进行观察。
可以看到,这个恶意程序解析出了一个域名www.practicalmalwareanalysis.com。解析出的域名作为了函数gethostbyname的参数,这个函数会返回一个IP地址,并且填充sockaddr_in结构。如果该函数执行失败,则会休眠30秒,再跳回main函数开始的位置,不断重复这一过程。如果该函数执行成功,可以看到参数为0x270F的htons的函数调用,它用于将主机字节顺序转换为网络字节顺序。然后调用connect函数来尝试连接远程主机。不论连接的成功与否,最终都会休眠30秒,然后再跳回main函数开始的位置,不断循环。如果能够连接成功,那么在休眠前,会调用位于0x004013A9位置的sub_401000函数。
这是一个反向的shell,它是一种往远程机器发送shell命令的技术。我们看到,在CreateProcessA这个函数被调用之前,传递给它的STARTUPINFO结构被修改了,而该结构用于指定新进程的主窗口特性。首先可以看到,StartupInfo.wShowWindow的值被设置为了0,表示它会以窗口隐藏的方式运行,而运行的对象就是cmd.exe,所以受害用户是看不到程序运行的。接着我们可以看到STARTUPINFO结构中的标准流被设置为一个套接字,这也就直接绑定了套接字和cmd.exe的标准流,所以cmd.exe被启动后,所有经过套接字的数据都将发送到cmd.exe,并且cmd.exe产生的所有输出都将通过套接字发出。
1、在二进制文件中,你看到的静态字符串是什么?
cmd
2、当你运行这个二进制文件时,会发生什么?
什么都没有发生,需要更改文件名。
3、怎样让恶意代码的攻击负载(payload)获得运行?
将文件名改为ocl.exe。
4、在地址0x00401133处发生了什么?
将两段字符串拷贝到栈上。
5、传递给子例程(函数)0x00401089的参数是什么?
一个参数就是最开始拷贝到栈上的“1qaz2wsx3edc”这段字符串,另一个参数是一个数据缓冲区.
6、恶意代码使用的域名是什么?
www.practicalmalwareanalysis.com
7、恶意代码使用什么编码函数来混淆域名?
异或
8、恶意代码在0x0040106E处调用CreateProcessA函数的意义是什么?
隐藏cmd.exe这个窗口运行shell。