恶意代码分析实战 3 IDA Pro

利用IDA PRO分析Lab05-01.dll
实验目的
利用IDA Pro分析Lab05-01.dll中发现的恶意代码,回答以下问题:

  1. DLLMain的地址是什么?

vmware_ktjJxPeOeW.png
可以空格转入反汇编查看DLLMain地址,或者
vmware_gyTfDNyZAq.png
vmware_rm7u98CFpi.png
DLLMain的地址是.text:0x1000D02E。

  1. 使用Imports窗口并浏览到gethostbyname,导入函数定位到什么地址?

这样的三步来寻找地址。
vmware_pG3Vogcjpr.png
vmware_JdWNgu5d08.png
地址是.idata:100163CC。

  1. 有多少函数调用了gethostbyname?

光标滑到函数所在位置,按下+开启交叉引用。
vmware_A12e4BZKR5.png
数一数发现不同地址的函数共有5个,所以gethostbyname被5个不同的函数调用了9次。
类型p是被调用的引用,类型r是被读取的引用。

  1. 将精力集中在位于0x10001757处的对gethostbyname的调用,你能找出哪个DNS请求将被触发吗?

按下G,快速跳转。
vmware_vSjTqk20TX.png
调用了函数,32位汇编通常把参数存在eax中,查看一下什么东西导入了eax。
vmware_yRkUx7rpIx.png
后面正好有一句eax+0xD,所以解析的是后面这一部分的网址。

  1. IDA Pro 识别了在0x10001656处的子过程中的多少个局部变量?

按G定位到函数,后面是负数的是局部变量。
vmware_8bmTLo4ppE.png
一共23个。

  1. IDA Pro识别了在0x10001656处的子过程中的多少个参数?

后面是正数的是参数,所以共有一个参数。

  1. 使用Strings窗口,来在反汇编中定位字符串 \cmd.exe /c, 它位于哪儿?

+ 打开Strings窗口,搜索该字符串。
vmware_HrP244kC0o.png
它的位置是 xdoors_d:10095B34 。

  1. 在引用 \cmd.exe /c的代码所在区域发生了什么?

跳转到它的调用部分。
vmware_9tgasrTxTg.png
看起来像是远程攻击者开启了一个远程shell对话。

  1. 在同样的区域,在0x100101C8处,看起来dword_1008E5C4好像是一个全局变量,它帮助决定走哪条路径。那恶意代码是如何设置dword_1008E5C4的呢?(提示:使用交叉引用)

双击进入data处,查看交叉引用,发现只有一处是对它进行了修改。
vmware_SSDNG0No6G.png

.text:10001673 call sub_10003695
.text:10001678 mov dword_1008E5C4, eax

进入该函数看一看,

.text:10003695 VersionInformation= _OSVERSIONINFOA ptr -94h
.text:10003695
.text:10003695 push ebp
.text:10003696 mov ebp, esp
.text:10003698 sub esp, 94h
.text:1000369E lea eax, [ebp+VersionInformation]
.text:100036A4 mov [ebp+VersionInformation.dwOSVersionInfoSize], 94h
.text:100036AE push eax ; lpVersionInformation
.text:100036AF call ds:GetVersionExA
.text:100036B5 xor eax, eax
.text:100036B7 cmp [ebp+VersionInformation.dwPlatformId], 2
.text:100036BE setz al
.text:100036C1 leave
.text:100036C2 retn
.text:100036C2 sub_10003695 endp

调用了GetVersionEx,用于获取操作系统版本的信息,其中将dwOSVersionInfoSize与数字2进行比较,来确定如何设置AL寄存器。如果PlatformId为VER_PLATFORM_WIN32_NT,AL会被置位,只是简单的判断当前操作系统是否Windows 2000或更高版本,我们可以得出结论,该全局变量通常会被置为1.

  1. 在位于0x1000FF58处的子过程中的几百行指令中,一系列使用memcmp来比较字符串的比较。如果对robotwork的字符串比较是成功的(当memcmp返回0),会发生什么?

.text:10010444 loc_10010444: ; CODE XREF: sub_1000FF58+4E0j
.text:10010444 push 9 ; Size
.text:10010446 lea eax, [ebp+Dst]
.text:1001044C push offset aRobotwork ; “robotwork”
.text:10010451 push eax ; Buf1
.text:10010452 call memcmp
.text:10010457 add esp, 0Ch
.text:1001045A test eax, eax
.text:1001045C jnz short loc_10010468
.text:1001045E push [ebp+s] ; s
.text:10010461 call sub_100052A2
.text:10010466 jmp short loc_100103F6

如果memcmp返回0,jnz是不是零的时候就跳转,会执行sub_100052A2函数,进入函数内部看看。

.text:100052DF push eax ; phkResult
.text:100052E0 push 0F003Fh ; samDesired
.text:100052E5 push 0 ; ulOptions
.text:100052E7 push offset aSoftwareMicros ; “SOFTWARE\Microsoft\Windows\CurrentVe”…
.text:100052EC push 80000002h ; hKey
.text:100052F1 call ds:RegOpenKeyExA

发现首先用RegOpenKeyExA函数打开了注册表HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion,然后查询了aWorktime和aWorktimes键也就是worktime和worktimes键的值,然后调用了sub_100038EE函数,
双击进入sub_100038EE函数查看,发现其调用了了malloc函数创建了内存空间,然后又调用了send函数,最后调用了free函数释放内存空间,所以猜测可能是对注册表SOFTWARE\Microsoft\Windows\CurrentVersion进行了修改或查询操作,然后再将结构发送出去。

  1. PSLIST导出函数做了什么?

vmware_GG45aGG4dP.png
通过菜单View->Open Subview->Exports,查看该DLL的导出表。在其中可以看到PSLIST,双击它,光标来到0x10007025处,也就是导出项代码的起始处。这个函数选择两条路径之一执行,这个选择取决于sub_100036C3的结果。sub_100036C3函数检查操作系统的版本是Windows Vista/7,或是 Windows XP/2003/2000。这两条路径都使用CreateToolhelp32Snapshot函数,从相关字符串和API调用来看,用于获得一个进程列表。这两条代码路径都通过send将进程列表通过socket发送。

  1. 使用图模式来绘制出对sub_10004E79的交叉引用图。当进入这个函数时,哪个API函数可能被调用?仅仅基于这些API函数,你会如何重命名这个函数?

首先定位到0x10004E79,然后将光标移动到感兴趣的函数名上,通过菜单的View->Graphs->User Xrefs Chart,我们可以得到函数的交叉引用图。
vmware_y8F7jqXNqN.png
该函数调用了GetSystemDefaultLangID和send,该信息告诉我们,该函数可能通过socket发送语音标志,因此,右击函数名,给他一个更有意义的名字,例如send_languageID

  1. DllMain直接调用了多少个Windows API?多少个在深度为2时被调用?

vmware_mRh1Owfq7F.png
DLLMain直接嗲用了strncpy,strnicmp、CreateThread 和 strlen这些API。进一步地,调用了非常多的API,包括Sleep、WinExec、getthostbyname,以及许多其他网络函数调用。

  1. 在0x10001358处,有一个对Sleep(一个使用一个包含要睡眠的毫秒数的参数的API函数)的调用。顺着代码向后看,如果这段代码执行,这个程序会睡眠多久?

vmware_DkfUINgToc.png
查看一下什么进了eax。
vmware_TOhm1mUiuV.png
是个30。
vmware_Wx5IHAG1vi.png
乘了1000。
所以恶意代码会休眠30秒。

  1. 在0x10001701处是一个对socket的调用,它的3个参数是什么?

2,1,6

  1. 使用MSDN页面的socket和IDA Pro中的命名符号常量,你能使参数更有意义吗?修改后,参数是什么?

Winsock2.h

SOCKET WSAAPI socket(
  [in] int af,
  [in] int type,
  [in] int protocol
);

https://learn.microsoft.com/zh-cn/windows/win32/api/Winsock2/nf-winsock2-socket
它的每个值的含义都在这里面。
我找了找,分别对应:
AF_INET
SOCK_STREAM
IPPROTO_TCP
可以这样进行修改。
vmware_DgEUn9s3eb.png
vmware_lW9b4DUNMr.png

  1. 搜索in指令(opcode 0xED)的使用。这个指令和一个魔术字符串VMXh用来进行Vmware检测。在这个恶意代码中被使用了吗?使用对执行in指令函数的交叉引用,能发现进一步检测Vmware的证据吗?

vmware_ne5bTj8AtZ.png
vmware_Fc6oXc2DgF.png
有“VMXh”样式字符串,可能有检测虚拟机的行为。

  1. 将你的光标跳转到0x1001D988处,你发现了什么?

在0x1001D988处可以看到一些看起来随机的数据。

  1. 如果你安装了IDA Python插件(包括IDA Pro的商业版本插件),运行Lab05-01.py,一个IDA Pro Python脚本(确定光标是在0x1001D988处),在运行该脚本后发生了什么?

首先安装IDAPython,参考链接如下:
https://blog.csdn.net/betabin/article/details/7318233
https://www.cnblogs.com/afublog/p/11228771.html
vmware_rGFMdqV0Eh.png
运行之后,不再是乱码了。

  1. 将光标放于同一位置,你如何将这个数据转成一个单一的ASCII字符串?

按下A键,就可以将其变为一个可读字符串了:

xdoor is this backdoor, string decoded for Practical Malware Analysis Lab :)1234

  1. 使用一个文本编辑器打开这个脚本。它是如何工作的?
sea = ScreenEA()

for i in range(0x00,0x50):
        b = Byte(sea+i)
        decoded_byte = b ^ 0x55
        PatchByte(sea+i,decoded_byte)

该脚本的工作原理是,对长度为0x50字节的数据,用0x55字节的数据,用0x55分别与其进行异或,然后用PatchByte函数在IDA中修改这些字节。

猜你喜欢

转载自blog.csdn.net/weixin_61823031/article/details/128758061