暴龙兽 发表于 2020-12-3 16:02

Rapid勒索病毒变种分析

本帖最后由 暴龙兽 于 2020-12-3 16:08 编辑

# Rapid勒索病毒变种分析
> 运行过程:
- 1 解密shellcode,跳转至shellcode
- 2 shellcode解密勒索病毒主体,将主体各个section覆写原始进程的section.
- 3 加密文件,显示勒索信息.

```c
md5: 40C5113E35DD653CA1FC1524D51DA408
sha1: C43028B0A2287D7E64199500D48CE7C5F864DC54
FileVersion: 1.0.0.1
InternalName: sgahfghjfghj.exe
LegalCopyright: Copyright (C) 2017, masesrziro
```

## 解密shellcode

> 1 样本最初会调用一些无关API,混淆视听.




> 2 分配0x401b8 byte内存空间,修改相应的内存属性,解密shellcode至分配的内存空间中.

```python
# 解密脚本
#!/usr/bin/python3
# -*- coding: UTF-8 -*-
import struct
from ctypes import *

# first 0x40 byte of shellcode, for example
shellcode = b"\x7c\x98\x39\x52\x45\x84\x52\x73\xA9\xEB\xDB\x07\x5F\xEC\x20\x1D" \
            b"\xD2\xE1\xE3x22\x02\x92\x36\xE8\x8C\x6C\x76\x2E\x11\x55\x42\xD3"\
            b"\x1F\x1A\x03\x94\xD8\xFF\x88\xD0\x90\x81\x72\xFB\xF0\x2F\x42\x14"\
            b"\x82\xC9\x8F\xBD\xD8\xE2\xDD\x3C\xBA\x62\xBB\x9B\x5D\x72\x09\xE5"

def decrypt(enc_one, enc_two):
    key0 = c_uint32(0xc6ef3720)
    # four parts of one group
    key1 = c_uint32(0x5aabd3f6)
    key2 = c_uint32(0xf770d8de)
    key3 = c_uint32(0x9ad9a390)
    key4 = c_uint32(0x5a454ee9)
    tmp_one = c_uint32(0)
    times = 0x20
    value_one = c_uint32(int.from_bytes(enc_one, byteorder='little'))
    value_two = c_uint32(int.from_bytes(enc_two, byteorder='little'))
    while times > 0:
      # 由于加法或程序有可能大于0x100000000, 所以需要与0xffffffff.
      value_two.value = value_two.value - ((key0.value + value_one.value)\
                  ^ ((key3.value + (value_one.value << 4) & 0xffffffff) & 0xffffffff)\
                  ^ (key4.value + (value_one.value >> 5) & 0xffffffff) & 0xffffffff)
      tmp_one.value = (key0.value + value_two.value)\
                  ^ ((key1.value + (value_two.value << 4) & 0xffffffff) & 0xffffffff)\
                  ^ ((key2.value + (value_two.value >> 5) & 0xffffffff) & 0xffffffff)
      key0.value += 0x61c88647
      value_one.value -= tmp_one.value
      times -= 1

    result = struct.pack('I', value_one.value)
    result += struct.pack('I', value_two.value)
    return result


if __name__ == "__main__":
    plain = bytes()
    for i in range(0, len(shellcode), 8):
      args_one = shellcode
      args_two = shellcode
      plain += decrypt(args_one, args_two)
   
    print("decrypt over")

```


## 释放勒索病毒本体
- 1 获取`LoadLibraryA、GetProcAddress和ImageBase`的地址


- 2 获取一些必要函数地址
```c
HMODULE kernel32 = LoadLibraryA("kernel32.dll")
GetProcAddress(kernel32, "VirtualAlloc");
GetProcAddress(kernel32, "VirtualProtect");
GetProcAddress(kernel32, "VirtualFree");
GetProcAddress(kernel32, "GetVersionEx");
GetProcAddress(kernel32, "TerminateProcess");
```




- 3 分配内存,解密勒索病毒,将其各个节区覆写原进程的section
```python
#解密脚本
#挺复杂的,有时间再补上吧
#可以执行之后,将PE文件dump出来.
```



- 4 填充导入表地址
```c
// 伪代码
while ImportDescriptor.Name != 0:
    LoadLibrary(ImportDescriptor.Name);
    GetProcAddress;
    ImportDescriptor += 0x14
```



- 5 判断是否需要重定位
> 重定位基本思想:假设原加载地址为A,现加载地址为B,需要重定位的地址为C, 重定位后的地址为D = C - A + B, 最后将这个地址覆写原地址C.
- 6 跳转至勒索病毒OEP

```c
jmp eax
```



## 勒索病毒执行
> 由于已经有该部分的详细分析报告,此部分省略。[报告链接](https://www.freebuf.com/articles/network/162033.html)

## 附件
> 附件中包含:原始样本和对应的IDB文件、提取的shellcode和对应的IDB 和 最终的勒索病毒.

暴龙兽 发表于 2020-12-4 15:40

blaze_et 发表于 2020-12-4 09:29
好厉害啊,前几天我们一台服务器中了.Globeimposter-Alpha865qqz勒索病毒,在查询日志的时候发现黑客留下的 ...

应该没啥关系的,和Process Hack2程序安装后文件夹中的内容几乎一样,都是合法的程序。

blaze_et 发表于 2020-12-4 09:29

好厉害啊,前几天我们一台服务器中了.Globeimposter-Alpha865qqz勒索病毒,在查询日志的时候发现黑客留下的一个程序,好多DLL和一个SYS,还有两个EXE,不知道和勒索病毒有关没,然后在虚拟机里打开也看不出来什么。{:1_890:}

暴龙兽 发表于 2020-12-3 16:11

欢迎讨论`shellcode`中对`ransomware`的解密算法

099o2vk5bm92 发表于 2020-12-3 16:20

很厉害学习了

小伟网络 发表于 2020-12-3 16:55

路过,支持一下

ZRB2010 发表于 2020-12-3 17:19

大佬牛皮,在仔细看看先,能不能放解密文件出来啊?

暴龙兽 发表于 2020-12-3 17:25

ZRB2010 发表于 2020-12-3 17:19
大佬牛皮,在仔细看看先,能不能放解密文件出来啊?

附件里面有的

awt1230 发表于 2020-12-3 17:57

路过,支持一下

hs14266 发表于 2020-12-3 19:18

需要JAVA才能看懂吗

z695946656 发表于 2020-12-3 19:24

谢谢,好东西

npfjcg 发表于 2020-12-3 19:28

加密套加密,好奇怪的处理方式
页: [1] 2 3 4
查看完整版本: Rapid勒索病毒变种分析