《恶意代码分析实战》实验——Labs-09
记录《恶意代码分析实战》中的实验,提供相关链接:
Labs-09-01实验
静态分析:
1. 查壳,无壳
2. 查看导入表:
KERNEL32.dll, (读取、复制、创建和修改文件,获取文件名和删除文件,创建进程,对比字符串,获取系统版本信息)
ADVAPI32.dll, (创建和删除服务,创建、修改和删除注册表,)
SHELL32.dll, (远程执行系统命令)
WS2_32.dll,(进行网络连接和数据传输)
3. Strings 分析: 出现可能会连接的网址,一个系统路径可能用于存放其他恶意文件,-cc, -re 和 -in 像是命令行的参数。
IDA分析
1)打开IDA分析,观察整体的流程图,发现会根据程序的参数进行跳转,发现当仅仅只有默认参数(即双击程序)时程序的逻辑会非常简单,不会有特别的代码执行;另一个多参数的分支则逻辑更加就复杂,挨个分析:
2)左边的逻辑分支会进行指定注册表的获取和分析,如果该键值不存在则直接会调用一个函数进行自我删除,如果存在的话,则会调用sub_402360 函数,然后结束。
3)跟进sub_402360 函数进行分析,发现存在一个死循环,其中仅调用了两个函数sub_401280和sub_402020函数
4) 先分析sub_401280,发现该函数会获取指定注册表下的键值对,并且放入指定的缓存中
5)再分析sub_402020函数,发现该函数是一个后门执行的函数,其中包括 “sleep”, “upload”, “download”, “cmd” 等指令;其中获取的指令是通过函数sub_401E60获得的。
6)再跟入函数sub_401E60进行分析,发现其中的sub_401AF0函数非常可疑,传给它的参数带有hots和name等关键词,猜测该函数可能涉及网络数据发送。
7)跟入该函数,发现该函数为一个网络数据发送和接受函数;其中网络数据包的相关参数来着前面函数sub_401470 和 sub_401D80从指定注册表的键值中获取。
8)右边分支发现一个函数sub_402510调用,此函数的调用直接影响下面的逻辑跳转,跟进去分析,发现该函数是一个程序执行密码的检测函数,通过参数输入的字符串,挨个比较,从而决定下一步的跳转逻辑:
i)先检查密码的长度是否为4,再依次检查第一位是否为‘a‘,第二位是否是’b‘,第三位是否是’c‘,第四位是否是’d‘ .
9)再根据逻辑往下分析,发现程序将根据命令行输入的另一个参数进行不同的代码执行,分别有几种模式 ‘-in‘, ‘-re’, ‘-c’, ‘-cc’
10)分析 “-in” 的模块,该模块又会进行参数个数的判断,但是在参数个数为3和为4的两个分支中都会调用同一个函数,经过分析,我们可以确定该函数为恶意程序的安装代码部分,重命名为Func_install,
- 选中该函数,然后F5进行伪代码分析,发现改代码会进行服务的创建和程序的自我复制到系统目录文件下。
- 但是在该段代码的一个分支调用了一个函数sub_4015B0,跟进该函数后发现该函数修改该新复制的文件的时间戳与系统文件一样。
- 同时该段代码还会跳转到下一个模块调用sub_401070函数,同时出现了可疑的字符串“60”,“80” 和 “http://www.practicalmalwareanalyss.com” 被作为参数传入到该函数。
- 跟入该函数进行分析,发现该函数会创建一个注册表项 “HKLM\SOFTWARE\Microsoft \XPS” 的 “configuration”键,并且修改相应的键值为输入的参数即上面的字符串。
11)分析 ‘-re‘ 模块,与 ’-in‘ 模块一样,该模块同样会判断参数的个数,三个参数和四个参数会跳转到不同的逻辑,但最终也会调用同一个函数sub_402900,右边函数在调用sub_402900之前还调用了sub_4025B0函数,该函数非常简单,用于获取当前程序的执行的绝对路径从而得到函数sub_402900的输入参数;而在左边的部分,该参数是由命令行输入提供的,也就是说两个分支会根据命令行输入参数的个数来获取调用函数sub_402900的参数。
- 跟进函数sub_402900 进行分析:发现该函数会根据传入的服务名删除程序创建的服务,同时根据指定路径进行程序的自我删除。
12)分析 “-c” 模块,该模块有两个逻辑分支,一个指向 “-cc” 模块,此处分析另一个模块,该模块需要7个参数,同时该函数还调用了sub_401070 函数来修改指定的键值。
13)再分析 “-cc” 模块,除了一些自我删除的函数调用逻辑模块外,另一个逻辑分支调用了函数sub_401280和sub_402E7E,
- 其中sub_401280 已经在第4)处分析过,该函数会获取指定注册项下的键值对,并且放入指定的缓存区中。
- 另一个函数sub_402E7E 被IDA划分为系统函数之列,同时该函数的输入参数为一个字符串和四个变量,这个与printf函数的格式非常相似,该函数为字符串打印函数。
14) 到此,该恶意程序的分析基本就结束了,对于恶意程序的分析,切记不能调入某一个细节中。
15)接下来进行总结:- 该恶意程序需要命令行 ‘-in’ 进行安装,同时安装需要密码 ‘abcd’
- 该恶意程序还能能执行多种指令 ‘-in’ 进行安装,‘-re’ 进行恶意程序的彻底清楚,‘-cc’ 进行注册表打印,‘-c’ 进行注册表配置
- 此恶意程序在成功安装后自我复制到指定系统目录下,并且创建服务进行自启动。
- 另外,该程序还会创建后门与C&C通信,执行任意命令。
问题
- 如何让代码安装自身?
回答:利用命令行输入参数 ‘-in’ 和密码 ‘abcd’ - 这个恶意代码的命令行选项是什么?它要求的密码是什么?
回答: 该恶意程序还能能执行多种指令 ‘-in’ 进行安装,‘-re’ 进行恶意程序的彻底清楚,‘-cc’ 进行注册表打印,‘-c’ 进行恶意代码更新配置;要求的密码是 ‘abcd’ - 如何利用OllyDbg永久修补这个恶意代码,使其不需要指定的命令行密码?
回答: 直接修改检验部分,跳过检验步骤即可 - 这个恶意代码基于系统的特征是什么?
回答:会创建一个指定注册表项 “HKLM\SOFTWARE\Microsoft \XPS” 的 “configuration”键”;同时会创建一个服务,该服务的名称由安转时传入的参数决定;另外,该程序还会自我赋值到Windows系统目录下。 - 这个恶意代码通过网络命令执行了哪些不同的操作?
回答:通过网络命令可以执行 “sleep”, “upload”, “download”, “cmd” 和 “nothing”; - 这个恶意代码是否有网络特征?
回答:会向指定的站点发出http (HTTP/1.0 GET) 请求,默认的站点是“http://www.practicaolmalwareanalysis.com”
Labs-09-02实验
静态分析:
Labs-09-03实验
静态分析:
1. 查壳,无壳
2. 查看导入表:
- KERNEL32.dll, (读取、复制、创建和修改文件,获取文件名和
- 删除文件,创建进程,对比字符串,获取系统版本信息)
- ADVAPI32.dll, (创建和删除服务,创建、修改和删除注册表,)
- SHELL32.dll, (远程执行系统命令)
- WS2_32.dll,(进行网络连接和数据传输)
3. Strings 分析: 出现可能会连接的网址,一个系统路径可能用于存放其他恶意文件,-cc, -re 和 -in 像是命令行的参数。
4. IDA分析
- 打开IDA分析,观察整体的流程图,发现会根据程序的参数进行跳转,发现当仅仅只有默认参数(即双击程序)时程序的逻辑会非常简单,不会有特别的代码执行;另一个多参数的分支则逻辑更加就复杂,挨个分析:
- 左边的逻辑分支会进行指定注册表的获取和分析,如果该键值不存在则直接会调用一个函数进行自我删除,如果存在的话,则会调用sub_402360 函数,然后结束。
- 跟进sub_402360 函数进行分析,发现存在一个死循环,其中仅调用了两个函数sub_401280和sub_402020函数
4) 先分析sub_401280,发现该函数会获取指定注册表下的键值对,并且放入指定的缓存中
5) 再分析sub_402020函数,发现该函数是一个后门执行的函数,其中包括 “sleep”, “upload”, “download”, “cmd” 等指令;其中获取的指令是通过函数sub_401E60获得的。
6) 再跟入函数sub_401E60进行分析,发现其中的sub_401AF0函数非常可疑,传给它的参数带有hots和name等关键词,猜测该函数可能涉及网络数据发送。
7) 跟入该函数,发现该函数为一个网络数据发送和接受函数;其中网络数据包的相关参数来着前面函数sub_401470 和 sub_401D80从指定注册表的键值中获取。
8) 右边分支发现一个函数sub_402510调用,此函数的调用直接影响下面的逻辑跳转,跟进去分析,发现该函数是一个程序执行密码的检测函数,通过参数输入的字符串,挨个比较,从而决定下一步的跳转逻辑:
- 先检查密码的长度是否为4,再依次检查第一位是否为‘a‘,第二位是否是’b‘,第三位是否是’c‘,第四位是否是’d‘ .
9) 再根据逻辑往下分析,发现程序将根据命令行输入的另一个参数进行不同的代码执行,分别有几种模式 ‘-in‘, ‘-re’, ‘-c’, ‘-cc’
10) 分析 “-in” 的模块,该模块又会进行参数个数的判断,但是在参数个数为3和为4的两个分支中都会调用同一个函数,经过分析,我们可以确定该函数为恶意程序的安装代码部分,重命名为Func_install,
- 选中该函数,然后F5进行伪代码分析,发现改代码会进行服务的创建和程序的自我复制到系统目录文件下。
- 但是在该段代码的一个分支调用了一个函数sub_4015B0,跟进该函数后发现该函数修改该新复制的文件的时间戳与系统文件一样。
- 同时该段代码还会跳转到下一个模块调用sub_401070函数,同时出现了可疑的字符串“60”,“80” 和 “http://www.practicalmalwareanalyss.com” 被作为参数传入到该函数。
- 跟入该函数进行分析,发现该函数会创建一个注册表项 “HKLM\SOFTWARE\Microsoft \XPS” 的 “configuration”键,并且修改相应的键值为输入的参数即上面的字符串。
- 分析 ‘-re‘ 模块,与 ’-in‘ 模块一样,该模块同样会判断参数的个数,三个参数和四个参数会跳转到不同的逻辑,但最终也会调用同一个函数sub_402900,右边函数在调用sub_402900之前还调用了sub_4025B0函数,该函数非常简单,用于获取当前程序的执行的绝对路径从而得到函数sub_402900的输入参数;而在左边的部分,该参数是由命令行输入提供的,也就是说两个分支会根据命令行输入参数的个数来获取调用函数sub_402900的参数。
- 跟进函数sub_402900 进行分析:发现该函数会根据传入的服务名删除程序创建的服务,同时根据指定路径进行程序的自我删除。
- 分析 “-c” 模块,该模块有两个逻辑分支,一个指向 “-cc” 模块,此处分析另一个模块,该模块需要7个参数,同时该函数还调用了sub_401070 函数来修改指定的键值。
- 再分析 “-cc” 模块,除了一些自我删除的函数调用逻辑模块外,另一个逻辑分支调用了函数sub_401280和sub_402E7E,
- 其中sub_401280 已经在第4)处分析过,该函数会获取指定注册项下的键值对,并且放入指定的缓存区中。
- 另一个函数sub_402E7E 被IDA划分为系统函数之列,同时该函数的输入参数为一个字符串和四个变量,这个与printf函数的格式非常相似,该函数为字符串打印函数。
5. 到此,该恶意程序的分析基本就结束了,对于恶意程序的分析,切记不能调入某一个细节中。
6. 接下来进行总结:
- 1) 该恶意程序需要命令行 ‘-in’ 进行安装,同时安装需要密码 ‘abcd’
- 2) 该恶意程序还能能执行多种指令 ‘-in’ 进行安装,‘-re’ 进行恶意程序的彻底清楚,‘-cc’ 进行注册表打印,‘-c’ 进行注册表配置
- 3) 此恶意程序在成功安装后自我复制到指定系统目录下,并且创建服务进行自启动。
- 4) 另外,该程序还会创建后门与C&C通信,执行任意命令。
问题
- 如何让代码安装自身?
回答:利用命令行输入参数 ‘-in’ 和密码 ‘abcd’ - 这个恶意代码的命令行选项是什么?它要求的密码是什么?
回答: 该恶意程序还能能执行多种指令 ‘-in’ 进行安装,‘-re’ 进行恶意程序的彻底清楚,‘-cc’ 进行注册表打印,‘-c’ 进行恶意代码更新配置;要求的密码是 ‘abcd’ - 如何利用OllyDbg永久修补这个恶意代码,使其不需要指定的命令行密码?
回答: 先在IDA中找到密码验证后的跳转地址,然后在OD中打开,找到指定位置直接修改反汇编代码跳到下个逻辑部分,然后保存二进制文件即可。 - 这个恶意代码基于系统的特征是什么?
回答:会创建一个指定注册表项 “HKLM\SOFTWARE\Microsoft \XPS” 的 “configuration”键”;同时会创建一个服务,该服务的名称由安转时传入的参数决定;另外,该程序还会自我赋值到Windows系统目录下。 - 这个恶意代码通过网络命令执行了哪些不同的操作?
回答:通过网络命令可以执行 “sleep”, “upload”, “download”, “cmd” 和 “nothing”; - 这个恶意代码是否有网络特征?
回答:会向指定的站点发出http (HTTP/1.0 GET) 请求,默认的站点是“http://www.practicaolmalwareanalysis.com”