diff --git a/src/generic-methodologies-and-resources/basic-forensic-methodology/malware-analysis.md b/src/generic-methodologies-and-resources/basic-forensic-methodology/malware-analysis.md index c395d19c8..fb35799e5 100644 --- a/src/generic-methodologies-and-resources/basic-forensic-methodology/malware-analysis.md +++ b/src/generic-methodologies-and-resources/basic-forensic-methodology/malware-analysis.md @@ -25,7 +25,7 @@ sudo apt-get install -y yara #### 准备规则 使用此脚本从github下载并合并所有yara恶意软件规则: [https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9](https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9)\ -创建 _**rules**_ 目录并执行它。这将创建一个名为 _**malware_rules.yar**_ 的文件,其中包含所有恶意软件的yara规则。 +创建_**rules**_目录并执行它。这将创建一个名为_**malware_rules.yar**_的文件,其中包含所有恶意软件的yara规则。 ```bash wget https://gist.githubusercontent.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9/raw/4ec711d37f1b428b63bed1f786b26a0654aa2f31/malware_yara_rules.py mkdir rules @@ -57,7 +57,7 @@ clamscan folderpath #Scan the whole folder ``` ### [Capa](https://github.com/mandiant/capa) -**Capa** 检测可疑的 **能力** 在可执行文件中:PE, ELF, .NET。因此,它会找到诸如 Att\&ck 策略或可疑能力,例如: +**Capa** 检测可执行文件中的潜在恶意 **能力**:PE、ELF、.NET。因此,它会找到诸如 Att\&ck 策略或可疑能力,例如: - 检查 OutputDebugString 错误 - 作为服务运行 @@ -70,7 +70,7 @@ clamscan folderpath #Scan the whole folder IOC 代表妥协指标。IOC 是一组 **条件,用于识别** 一些潜在的不需要的软件或确认的 **恶意软件**。蓝队使用这种定义来 **搜索这种恶意文件** 在他们的 **系统** 和 **网络** 中。\ 共享这些定义非常有用,因为当恶意软件在计算机中被识别并为该恶意软件创建 IOC 时,其他蓝队可以使用它更快地识别恶意软件。 -创建或修改 IOC 的工具是 [**IOC Editor**](https://www.fireeye.com/services/freeware/ioc-editor.html)**.**\ +创建或修改 IOCs 的工具是 [**IOC Editor**](https://www.fireeye.com/services/freeware/ioc-editor.html)**.**\ 您可以使用 [**Redline**](https://www.fireeye.com/services/freeware/redline.html) 等工具来 **搜索设备中的定义 IOC**。 ### Loki @@ -92,7 +92,7 @@ Compares process connection endpoints with C2 IOCs (new since version v.10) ``` ### Linux Malware Detect -[**Linux Malware Detect (LMD)**](https://www.rfxn.com/projects/linux-malware-detect/) 是一个针对Linux的恶意软件扫描器,发布于GNU GPLv2许可证,旨在应对共享托管环境中的威胁。它使用来自网络边缘入侵检测系统的威胁数据,提取正在攻击中积极使用的恶意软件,并生成检测签名。此外,威胁数据还来自用户提交的LMD结账功能和恶意软件社区资源。 +[**Linux Malware Detect (LMD)**](https://www.rfxn.com/projects/linux-malware-detect/) 是一个针对Linux的恶意软件扫描器,发布于GNU GPLv2许可证,旨在应对共享托管环境中面临的威胁。它使用来自网络边缘入侵检测系统的威胁数据,提取正在攻击中积极使用的恶意软件,并生成检测签名。此外,威胁数据还来自用户提交的LMD结账功能和恶意软件社区资源。 ### rkhunter @@ -110,7 +110,7 @@ sudo ./rkhunter --check -r / -l /tmp/rkhunter.log [--report-warnings-only] [--sk ### PEstudio -[PEstudio](https://www.winitor.com/download) 是一个工具,可以获取 Windows 可执行文件的信息,如导入、导出、头部,同时还会检查病毒总数并找到潜在的 Att\&ck 技术。 +[PEstudio](https://www.winitor.com/download) 是一个工具,可以获取 Windows 可执行文件的信息,如导入、导出、头部信息,同时还会检查病毒总数并找到潜在的 Att\&ck 技术。 ### Detect It Easy(DiE) @@ -141,14 +141,96 @@ spctl --assess --verbose /Applications/Safari.app ### 文件堆叠 -如果你知道某个文件夹包含的**文件**的web服务器**最后更新于某个日期**。**检查**所有**文件**在**web服务器**中被创建和修改的**日期**,如果有任何日期是**可疑的**,检查该文件。 +如果你知道某个包含**文件**的文件夹**最后更新于某个日期**。**检查**所有**文件**在**web 服务器**中的**创建和修改日期**,如果有任何日期是**可疑的**,请检查该文件。 ### 基线 -如果一个文件夹的文件**不应该被修改**,你可以计算该文件夹**原始文件**的**哈希**值,并与**当前**文件进行**比较**。任何被修改的文件都将是**可疑的**。 +如果一个文件夹的文件**不应该被修改**,你可以计算该文件夹**原始文件**的**哈希**并与**当前**文件进行**比较**。任何被修改的文件都将是**可疑的**。 ### 统计分析 当信息保存在日志中时,你可以**检查统计数据,比如每个web服务器的文件被访问的次数,因为web shell可能是其中之一**。 +--- + +## 反混淆动态控制流 (JMP/CALL RAX 调度器) + +现代恶意软件家族严重滥用控制流图 (CFG) 混淆:它们不是直接跳转/调用,而是在运行时计算目标并执行`jmp rax`或`call rax`。一个小型*调度器*(通常九条指令)根据CPU的`ZF`/`CF`标志设置最终目标,完全破坏静态CFG恢复。 + +该技术 - 由SLOW#TEMPEST加载器展示 - 可以通过一个仅依赖于IDAPython和Unicorn CPU模拟器的三步工作流程来击败。 + +### 1. 定位每个间接跳转/调用 +```python +import idautils, idc + +for ea in idautils.FunctionItems(idc.here()): +mnem = idc.print_insn_mnem(ea) +if mnem in ("jmp", "call") and idc.print_operand(ea, 0) == "rax": +print(f"[+] Dispatcher found @ {ea:X}") +``` +### 2. 提取调度程序字节码 +```python +import idc + +def get_dispatcher_start(jmp_ea, count=9): +s = jmp_ea +for _ in range(count): +s = idc.prev_head(s, 0) +return s + +start = get_dispatcher_start(jmp_ea) +size = jmp_ea + idc.get_item_size(jmp_ea) - start +code = idc.get_bytes(start, size) +open(f"{start:X}.bin", "wb").write(code) +``` +### 3. 使用Unicorn模拟两次 +```python +from unicorn import * +from unicorn.x86_const import * +import struct + +def run(code, zf=0, cf=0): +BASE = 0x1000 +mu = Uc(UC_ARCH_X86, UC_MODE_64) +mu.mem_map(BASE, 0x1000) +mu.mem_write(BASE, code) +mu.reg_write(UC_X86_REG_RFLAGS, (zf << 6) | cf) +mu.reg_write(UC_X86_REG_RAX, 0) +mu.emu_start(BASE, BASE+len(code)) +return mu.reg_read(UC_X86_REG_RAX) +``` +运行 `run(code,0,0)` 和 `run(code,1,1)` 以获取 *false* 和 *true* 分支目标。 + +### 4. 修补直接跳转 / 调用 +```python +import struct, ida_bytes + +def patch_direct(ea, target, is_call=False): +op = 0xE8 if is_call else 0xE9 # CALL rel32 or JMP rel32 +disp = target - (ea + 5) & 0xFFFFFFFF +ida_bytes.patch_bytes(ea, bytes([op]) + struct.pack('