首页
社区
课程
招聘
[原创]记一次MEMZ样本分析
2021-5-6 13:30 8155

[原创]记一次MEMZ样本分析

2021-5-6 13:30
8155

样本信息

彩虹猫病毒是一个基本的恶搞病毒,没有采取隐藏或者免杀等技术,适合新手分析。该病毒会修改MBR主引导扇区,以此来破坏电脑的正常启动,属于MBR病毒。在修改MBR后,电脑蓝屏,Windows无法启动,一直播放一个彩虹猫的画面。

 

MEMZ000

运行样本

双击加载病毒,会出现这样的2个提示框,告知你这是一个恶搞程序,是否要运行,

 

MEMZ001

 

点击确认过后弹出记事本程序。

 

MEMZ003

 

之后会出现:

  • 6个MEMZ进程
  • 多个浏览器窗口
  • 鼠标不受控制
  • 窗口颜色发生变化
  • 弹出很多图标
  • ...

MEMZ004

 

任意关掉一个MEMZ进程,或者关闭计算机,系统就会崩溃蓝屏,重启电脑之后,会发现无法登陆系统,一只彩虹猫随着音乐在那儿跳。这说明MBR已经被修改,无法引导操作系统的启动。

 

MEMZ005

 

MEMZ006

静态分析

首先使用PEID和ExeInfoPE对样本进行查壳,查壳结果如下:

 

MEMZ007

 

PEID查出有ASProtect壳,但是拖入ida似乎是没壳的,很奇怪。

 

StudyPE+查看导入表

 

MEMZ008

 

导入函数中我们需要注意如下API函数:

功能 dll API
改变窗口 GDI32 bitblt、stretchblt
调用外部程序 SHELL32 ShellExecute
播放音乐 WINMM PlaySoundA
鼠标失控 USER32 SetCursorPos、GetCursorPos
建立消息循环 USER32 GetMessage、TranslateMessage、DispatchMessage
设置消息钩子 USER32 SetWindowHookEx、UnhookWindowHookEx、CallNextHookEx
进程提权 ADVAPI32 OpenprocessToken、LookupPrivilegeValue、AdjustTokenPrivileges
遍历进程 KERNEL32 CreateToolhelp32Snapshot、Process32First、Process32Next
 

将样本载入ida,整体上看start()函数,函数大体上是由两个if判断组成。

 

由于start()函数大体上可以分成三个部分:启动部分、watchdog部分、main部分。

启动部分

在最开始,程序先获取窗口长、宽和命令行参数。

 

MEMZ009

 

由于我们第一次双击样本时自然是不带参数的,于是程序流跳转到下面两个弹窗的if判断部分。

 

如果用户在这两个提示窗口都点击了确认,系统则会分配局部内存对象;

 

以"/watch2dog"为参数创建5个名为MEMZ的进程。

 

MEMZ013

 

之后以"/main"为参数再生成一个MEMZ的进程。

 

到这里,样本创建了6个MEMZ的进程。

 

然后SetPriorityClass函数把main进程的优先级设置为最高。

 

MEMZ014

 

最后,用ExitProcess函数结束自己的进程。至此,启动部分结束。

watchdog部分

首先判断是否为”/watchdog“为参数的MEMZ进程,如果不是,创建线程,注册窗口并进行消息循环

 

MEMZ010

 

启动阶段创建的5个以“/watchdog”为参数的MEMZ进程。这5个进程一共应该创建了5个线程。我们进入sub_40114A看看这个线程具体干了些什么事。

sub_40114A

首先LocalAlloc在堆中分配空间用来存路径字符串,然后GetCurrentProcess获取当前进程句柄,然后GetProcessImageFileNameA获取进程路径。

 

然后一个while死循环,其中大概可以分为两个部分:

 

CreateToolhelp32Snapshot拍摄进程快照,再用Process32FirstWProcess32NextW进行遍历。do-while循环统计MEMZ进程的数量,将其存入v4变量。而sleep函数的存在也使得while死循环每隔一段时间统计当前MEMZ进程的个数并存放在v4变量中。

 

v4存放当前遍历到的MEMZ进程数量,而v7存放上一次遍历到的MEMZ的进程的数量,一旦V4的值小于v7,代表如果我们关闭了一个MEMZ进程,那么就会被if检测语句检测到,执行sub_401021函数内容。结合之前运行病毒我们可以推测sub_401021就是蓝屏关机。

 

MEMZ011

sub_401021

这个函数就有意思了,

 

do-while循环20次创建了20个线程,每次sleep0.1秒;而紧接着RtlAdjustPrivilege提权过后NtRaiseHardError制造系统蓝屏;

 

之后OpenProcessToken获取进程token,AdjustTokenPrivilege利用得到的进程token提权过后ExitWindowsEx强制注销系统。

 

MEMZ012

StartAddress

线程函数指针StartAddress点不开,我们直接查看汇编代码如下:

 

MEMZ013

 

SetWindowsHookExUnhookWindowsHookEx用于给窗口下钩子,回调函数fn中看具体操作。

 

MEMZ016

 

code=等于3代表着窗口即将被创建,lParam表示该窗口的基本信息,创建窗口之前修改当前窗口的这些信息用于随机修改窗口的位置。

 

有26条消息保存在lpText所指向的地址中。使用sub_401A55获取随机数,ds:dword_402AD0存放的值为0x1A,随机数对0x1A取余,结果存放在edx寄存器,以实现在26条消息中随机选取一条MessageBoxA弹出显示。

 

MEMZ014

 

MEMZ015

 

至此我们确认了sub_40114A函数的作用,正如我们上面的猜想,sub_40114A函数确实制造了蓝屏关机,先创建20个线程弹出大量位置和内容都随机的窗口,再蓝屏、强制关机。

sub_401000

sub_401000是个回调函数。16和22分别对应窗口消息WM_CLOSEWM_ENDSESSION,而WM_CLOSEWM_ENDSESSION消息是在系统关机时,由操作系统发送给各个窗口。

 

MEMZ017

 

如果是WM_CLOSEWM_ENDSESSION,则调用sub_401021函数蓝屏强制关机,如果是其他消息,丢给系统默认处理函数DefWindowProcW

 

sub_401021这个强制关机函数在两处被调用。第一个是监测watchdog参数的MEMZ进程数量,如有减少就调用。第二个是监测用户是否主动关机,如果主动关机也调用此函数。这和我们运行阶段看到的一致。

main部分

main部分大致也可细分为两个部分:覆盖MBR部分和10个线程部分。

 

我们先来看看下面的10个线程部分:

10个线程部分

此处的do-while循环以v8为计数器循环十次,调用CreateThread创建线程,创建10个线程。参数v9被赋予初始值off_405130,每次循环自增2。

 

MEMZ022

 

off_405130

 

off_405130内容如下:

 

MEMZ023

 

稍微修改一下,显示为下图这样:

 

MEMZ024

 

结合上面的代码,容易看出,此处数据是个结构体组成的数组,数组元素有10个,结构体大致如下:

1
2
3
4
struct FuncAddrDelay {
    DWORD    pFuncAddr;
      DWORD    dwTimeDelay;
}

j结合代码,我们知道CreateThread创建了10个进程,每次创建有一定的延迟时间,延迟时间和进程的函数地址组成一个结构体,共10组放在一个大数组off_405130里。

 

然后sub_401A2B依次调用这10个函数。10个函数每个的返回值被保存在v1,每次循环都会在if语句中判断v1自减1后是否为0,其实返回值就是决定循环的次数,以及这10个函数的激活时间。这10个函数中,有的需要一个固定的激活时间,有的需要一个随机的激活时间,只需要控制返回值即v1就可以了。

 

MEMZ025

 

这10个函数就是打开浏览器,鼠标失控,弹窗,弹图标等等操作。下面我们来单独看看:

线程1:

运行浏览器软件,随机打开网站浏览,运行任务管理器,注册表管理器,计算器等

 

MEMZ025

 

MEMZ026

 

MEMZ027

线程2:

鼠标位置失控

 

MEMZ028

线程3

插入键盘事件,对键盘进行监控

 

MEMZ029

线程4

病毒运行的过程中发出声音

 

MEMZ030

线程5

改变屏幕显示复制桌面界面

 

MEMZ031

 

此次BitBlt的作用就是对桌面像素进行位块转换。

线程6

弹出“Still using this computer?”的MessageBox

 

MEMZ032

 

MEMZ033

线程7

在鼠标位置绘制图标

 

MEMZ034

线程8

枚举子窗口,将子窗口变形

 

MEMZ035

线程9

界面大小改变,桌面变形

 

MEMZ036

线程10

改变桌面颜色

 

MEMZ037

覆盖MBR部分

该部分是病毒的核心部分,硬盘最开头的512字节就是MBR部分。MBR里的代码进行各种初始化工作,然后再把控制权转移给操作系统。

 

而该病毒覆盖MBR(Master Boot Record)主引导区,写入播放循环彩虹猫视频的代码,导致Windows系统无法启动。

 

MEMZ038

 

先来看看覆盖MBR部分:

 

QQ截图20210430134251

 

首先CreateFileA以读写权限打开文件PhysicalDrive0即主硬盘文件,再在堆中写入恶意代码,然后通过WriteFile将堆中的恶意代码写到PhysicalDrive0主硬盘文件。然后用LocalAlloc以0为初始值分配一段内存空间,拷贝两段恶意代码数据到分配的内存空间。

 

第一段byte_402118大小303字节覆盖部分MBR(或者初始化恶意代码?因为并没有完全覆盖MBR),第二段开始于510字节处,byte_402248大小1952字节,推测是覆盖MBR后播放的那段彩虹猫的数据。(不太清楚为什么中间跳过了206字节?)。

 

下面我们将这两部分数据dump出来分析。

 

然后作者创建了个note.txt文件,在其中写了段话,并用notepad.exe打开note.txt文件。

 

MEMZ021

 

静态分析大概就这些内容。


[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

收藏
点赞1
打赏
分享
最新回复 (2)
雪    币: 1657
活跃值: (6833)
能力值: ( LV12,RANK:215 )
在线值:
发帖
回帖
粉丝
天象独行 2 2021-7-17 21:32
2
0
学习了,学习了
雪    币: 490
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
快乐小牛 2021-8-9 09:52
3
0
MEMZ 源码级分析 - mnihyc's Blog
https://mnihyc.com/blog/archives/556
游客
登录 | 注册 方可回帖
返回