2022 - ACTF dropper & kcov
字数 1168 2025-08-06 21:48:51

ACTF 2022 dropper & kcov 题目逆向分析教学

题目概述

本教学文档基于R4战队的WP分析ACTF 2022中的dropper和kcov题目,重点讲解KCOV题目的正规逆向方法。

dropper题目分析

初步分析

  1. 题目提供了一个名为dropper的二进制文件
  2. 运行后提示需要输入flag
  3. 输入错误会显示"Wrong!"

逆向过程

  1. 静态分析

    • 使用IDA Pro打开二进制文件
    • 定位到main函数,发现主要逻辑在验证用户输入
    • 发现关键比较函数sub_4011C6
  2. 动态调试

    • 使用GDB附加进程
    • 在比较函数处设置断点
    • 观察寄存器值和内存变化
  3. 关键发现

    • 程序使用了反调试技术
    • 通过ptrace检测是否被调试
    • 需要patch掉反调试代码才能正常分析

解题步骤

  1. 绕过反调试:

    • 修改二进制文件,将ptrace调用nop掉
    • 或者使用LD_PRELOADhook掉ptrace函数
  2. 分析加密逻辑:

    • 输入经过多层变换
    • 包括异或、位移和查表操作
    • 最终与硬编码数据比较
  3. 编写解密脚本:

    • 逆向加密过程
    • 提取硬编码数据
    • 实现逆向算法得到flag

kcov题目分析

题目背景

kcov是Linux内核的一个覆盖率收集工具,此题利用了这个特性。

逆向过程

  1. 文件分析

    • 题目提供kcov.ko内核模块
    • 需要加载到内核进行调试
  2. 关键函数

    • init_module: 模块初始化函数
    • kcov_open: 打开设备时的处理
    • kcov_ioctl: 处理ioctl命令
    • kcov_read: 读取数据
  3. 漏洞点

    • ioctl命令处理存在整数溢出
    • 可导致内核堆溢出
    • 利用此漏洞可以提权

利用步骤

  1. 触发漏洞

    • 打开设备文件/dev/kcov
    • 发送特制ioctl命令
    • 触发整数溢出和堆溢出
  2. 内存布局

    • 需要精确控制堆分配
    • 布局目标对象在溢出区域附近
  3. 提权利用

    • 覆盖关键内核结构体
    • cred结构体或函数指针
    • 最终获取root权限

防御绕过

  1. SMEP/SMAP绕过

    • 使用ROP技术
    • 或者修改页表属性
  2. KASLR绕过

    • 通过信息泄露获取内核基址
    • 或者暴力猜测偏移

关键知识点总结

  1. Linux内核模块逆向

    • 内核模块加载/卸载机制
    • 内核与用户空间交互接口
    • 内核数据结构识别
  2. 内核漏洞利用

    • 整数溢出漏洞利用
    • 内核堆风水布局
    • 权限提升技术
  3. 反调试对抗

    • ptrace检测与绕过
    • 代码patch技术
    • 动态调试技巧
  4. 覆盖率导向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;
}

学习建议

  1. 深入理解Linux内核机制
  2. 练习内核模块逆向分析
  3. 研究公开的内核漏洞利用案例
  4. 掌握反调试和反逆向技术
  5. 参与CTF比赛积累实战经验
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_PRELOAD hook掉 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解题脚本 kcov利用代码 学习建议 深入理解Linux内核机制 练习内核模块逆向分析 研究公开的内核漏洞利用案例 掌握反调试和反逆向技术 参与CTF比赛积累实战经验