静态数据
- MD5
sha1,5C1F90ABD22AA3ED55638228862B7A24D4A38CDB
sha256,2AC6635A26049D354C0C46243F6451E6594B130745A08C5A99E96A64FBBBEC0F
- 有壳UPX - signature,UPX -> www.upx.sourceforge.net.
- 导入表 - 发现有GetProcAddress函数,可以作为脱壳线索
GetUserNameA,0x00,0xA0F8,reckoning,implicit,-,-,advapi32.dll
URLDownloadToCacheFileA,0x00,0xA106,network,implicit,-,x,urlmon.dll
VirtualProtect,0x00,0xA0BE,memory,implicit,-,x,kernel32.dll
VirtualAlloc,0x00,0xA0CE,memory,implicit,-,-,kernel32.dll
VirtualFree,0x00,0xA0DC,memory,implicit,-,-,kernel32.dll
ExitProcess,0x00,0xA0EA,execution,implicit,-,-,kernel32.dll
LoadLibraryA,0x00,0xA0A0,dynamic-library,implicit,-,-,kernel32.dll
GetProcAddress,0x00,0xA0AE,dynamic-library,implicit,-,-,kernel32.dll
脱壳
寻找OEP
- 使用OllyDbg打开,搜索GetProcAddress函数并下断点,运行程序,如下:
76855F20 > 8BFF mov edi, edi ; Lab18-01.0040800F
76855F22 55 push ebp
76855F23 8BEC mov ebp, esp
76855F25 FF75 04 push dword ptr [ebp+4]
76855F28 FF75 0C push dword ptr [ebp+C]
76855F2B FF75 08 push dword ptr [ebp+8]
76855F2E FF15 200C8C76 call dword ptr [<&KERNELBASE.GetProcAddressForCaller>] ; KERNELBA.GetProcAddressForCaller
76855F34 5D pop ebp
76855F35 C2 0800 retn 8
- 发现该函数只是对GetProcAddress的封装,跳出该函数如下,发现该段loop函数应该是建立导入表:
00409EE1 > > /8A07 mov al, byte ptr [edi] ; build import table
00409EE3 . |47 inc edi
00409EE4 . |08C0 or al, al
00409EE6 .^|74 DC je short 00409EC4
00409EE8 . |89F9 mov ecx, edi
00409EEA . |57 push edi
00409EEB . |48 dec eax
00409EEC . |F2:AE repne scas byte ptr es:[edi]
00409EEE . |55 push ebp
00409EEF . |FF96 54900000 call dword ptr [esi+9054] ; call GetProcAddress
00409EF5 . |09C0 or eax, eax ; KERNEL32.Sleep
00409EF7 . |74 07 je short 00409F00
00409EF9 . |8903 mov dword ptr [ebx], eax
00409EFB . |83C3 04 add ebx, 4
00409EFE .^\EB E1 jmp short <build import table>
- 往下拉,发现有个疑似tail jump,后面全是0x00,跳转后第一条指令也是 push ebp,初步判断0x0040154F即为OEP:
00409F3C . 39C4 cmp esp, eax
00409F3E .^ 75 FA jnz short 00409F3A
00409F40 . 83EC 80 sub esp, -80
00409F43 .- E9 0776FFFF jmp 0040154F ; 目标 jump
00409F48 00 db 00
00409F49 00 db 00
00409F4A 00 db 00
00409F4B 00 db 00
00409F4C 00 db 00
建立输入表
- dump上面找到OEP的process,记录OEP;
- 使用imprec工具修复import table,并转存。
脱壳后静态数据:
- 导入表 - 存在网络下载,文件写入,内存操作等功能函数。
URLDownloadToCacheFileA,0xE3,0xB4EA,network,implicit,-,x,urlmon.dll
HeapCreate,0x34D,0xB3A8,memory,implicit,-,-,kernel32.dll
VirtualAlloc,0x5CC,0xB438,memory,implicit,-,-,kernel32.dll
GetFileType,0x254,0xB37A,file,implicit,-,-,kernel32.dll
WriteFile,0x618,0xB3DC,file,implicit,-,-,kernel32.dll
CreateProcessA,0xE6,0xB21C,execution,implicit,-,-,kernel32.dll
- 字符串检查 - 存在一个URL。
ascii,49,0x00006062,-,format-string,-,http://www.practicalmalwareanalysis.com/%s/%c.png
动态数据:
执行程序后,发现有DNS query发往www.practicalmalwareanalysis.com。
17 11.641527456 192.168.190.129 192.168.190.1 DNS 92 Standard query 0xc711 A www.practicalmalwareanalysis.com
IDA 分析
- 进入main,首先是使用GetCurrentHWProfileA获取hardware的GUID.
- 然后将GUID的最后12个数字以mac地址的格式写入字符串:
movsx edx, [ebp+HwProfileInfo.szHwProfileGuid+24h]
push edx
movsx eax, [ebp+HwProfileInfo.szHwProfileGuid+23h]
push eax
movsx ecx, [ebp+HwProfileInfo.szHwProfileGuid+22h]
push ecx
movsx edx, [ebp+HwProfileInfo.szHwProfileGuid+21h]
push edx
movsx eax, [ebp+HwProfileInfo.szHwProfileGuid+20h]
push eax
movsx ecx, [ebp+HwProfileInfo.szHwProfileGuid+1Fh]
push ecx
movsx edx, [ebp+HwProfileInfo.szHwProfileGuid+1Eh]
push edx
movsx eax, [ebp+HwProfileInfo.szHwProfileGuid+1Dh]
push eax
movsx ecx, [ebp+HwProfileInfo.szHwProfileGuid+1Ch]
push ecx
movsx edx, [ebp+HwProfileInfo.szHwProfileGuid+1Bh]
push edx
movsx eax, [ebp+HwProfileInfo.szHwProfileGuid+1Ah]
push eax
movsx ecx, [ebp+HwProfileInfo.szHwProfileGuid+19h]
push ecx
push offset aCCCCCCCCCCCC ; "%c%c:%c%c:%c%c:%c%c:%c%c:%c%c"
lea edx, [ebp+guid_last12bytes]
push edx ; char *
call _sprintf
- 再GetUserName获得当前用户的用户名,并与之前的GUID字符串结合成'guid_last12bytes-username'的格式。
- 接着,程序会将该字符串用Base64的方式进行加密,注意该程序将a作为了默认padding字符。
- 并将密文以http://www.practicalmalwareanalysis.com/ODA6NmU6NmY6NmU6Njk6NjMtWW9kYWEa/a.png的格式使用URLDownloadToCacheFileA函数进行下载文件。
- 最后使用CreateProcess进行执行。
总结
该程序使用了UPX壳,使用在GetProcAddress下bp的方式找到OEP,再重建输入表进行脱壳。
脱壳后分析程序,首先获取了主机的硬件信息和用户名信息,使用Base64方式进行加密,并将加密字符串发往www.practicalmalwareanalysis.com,下载相应的文件,并执行。
|