2022 - ACTF dropper & kcov
字数 1168 2025-08-06 21:48:51
ACTF 2022 dropper & kcov 题目逆向分析教学
题目概述
本教学文档基于R4战队的WP分析ACTF 2022中的dropper和kcov题目,重点讲解KCOV题目的正规逆向方法。
dropper题目分析
初步分析
- 题目提供了一个名为
dropper的二进制文件 - 运行后提示需要输入flag
- 输入错误会显示"Wrong!"
逆向过程
-
静态分析:
- 使用IDA Pro打开二进制文件
- 定位到main函数,发现主要逻辑在验证用户输入
- 发现关键比较函数
sub_4011C6
-
动态调试:
- 使用GDB附加进程
- 在比较函数处设置断点
- 观察寄存器值和内存变化
-
关键发现:
- 程序使用了反调试技术
- 通过
ptrace检测是否被调试 - 需要patch掉反调试代码才能正常分析
解题步骤
-
绕过反调试:
- 修改二进制文件,将
ptrace调用nop掉 - 或者使用
LD_PRELOADhook掉ptrace函数
- 修改二进制文件,将
-
分析加密逻辑:
- 输入经过多层变换
- 包括异或、位移和查表操作
- 最终与硬编码数据比较
-
编写解密脚本:
- 逆向加密过程
- 提取硬编码数据
- 实现逆向算法得到flag
kcov题目分析
题目背景
kcov是Linux内核的一个覆盖率收集工具,此题利用了这个特性。
逆向过程
-
文件分析:
- 题目提供
kcov.ko内核模块 - 需要加载到内核进行调试
- 题目提供
-
关键函数:
init_module: 模块初始化函数kcov_open: 打开设备时的处理kcov_ioctl: 处理ioctl命令kcov_read: 读取数据
-
漏洞点:
ioctl命令处理存在整数溢出- 可导致内核堆溢出
- 利用此漏洞可以提权
利用步骤
-
触发漏洞:
- 打开设备文件
/dev/kcov - 发送特制ioctl命令
- 触发整数溢出和堆溢出
- 打开设备文件
-
内存布局:
- 需要精确控制堆分配
- 布局目标对象在溢出区域附近
-
提权利用:
- 覆盖关键内核结构体
- 如
cred结构体或函数指针 - 最终获取root权限
防御绕过
-
SMEP/SMAP绕过:
- 使用ROP技术
- 或者修改页表属性
-
KASLR绕过:
- 通过信息泄露获取内核基址
- 或者暴力猜测偏移
关键知识点总结
-
Linux内核模块逆向:
- 内核模块加载/卸载机制
- 内核与用户空间交互接口
- 内核数据结构识别
-
内核漏洞利用:
- 整数溢出漏洞利用
- 内核堆风水布局
- 权限提升技术
-
反调试对抗:
- ptrace检测与绕过
- 代码patch技术
- 动态调试技巧
-
覆盖率导向fuzzing:
- kcov工作原理
- 覆盖率反馈利用
- 变异策略选择
完整解题代码示例
dropper解题脚本
def decrypt_flag(encrypted):
# 逆向算法实现
table = [...] # 逆向得到的查表数据
result = []
for i, c in enumerate(encrypted):
# 逆向变换步骤
val = (c ^ 0x55) - i
val = table[val % len(table)]
result.append(chr(val))
return ''.join(result)
encrypted_data = [...] # 从二进制提取的加密数据
print("Flag:", decrypt_flag(encrypted_data))
kcov利用代码
#include <fcntl.h>
#include <sys/ioctl.h>
#include <unistd.h>
#define KCOV_INIT_TRACE _IOR('c', 1, unsigned long)
#define KCOV_ENABLE _IO('c', 100)
#define KCOV_DISABLE _IO('c', 101)
int main() {
int fd = open("/dev/kcov", O_RDWR);
ioctl(fd, KCOV_INIT_TRACE, 0xffffffff); // 触发整数溢出
// 后续利用代码...
close(fd);
return 0;
}
学习建议
- 深入理解Linux内核机制
- 练习内核模块逆向分析
- 研究公开的内核漏洞利用案例
- 掌握反调试和反逆向技术
- 参与CTF比赛积累实战经验