逆向工程实战:2020第五空间智能安全大赛re题分析与解决方案

1次阅读
没有评论

共计 1774 个字符,预计需要花费 5 分钟才能阅读完成。

image.webp

背景介绍

2020 第五空间智能安全大赛的逆向工程题目旨在考察选手对真实场景下二进制文件的分析能力。题目聚焦三个核心维度:

逆向工程实战:2020 第五空间智能安全大赛 re 题分析与解决方案

  1. 对抗现代反逆向技术(如代码混淆、反调试)
  2. 复杂算法的逆向还原能力
  3. 多工具链协同分析的工作流搭建

题目分析

文件格式识别

使用 file 命令初步检查发现是 32 位 ELF 文件,但存在以下特征:

  • 节区头部表被部分擦除
  • 存在自定义的 .obfusc
  • 关键函数引用动态链接库符号时采用延迟绑定

保护机制分析

通过工具检测发现三重保护:

  1. UPX 变种壳:修改了标准 UPX 的魔术字,常规脱壳工具失效
  2. 控制流平坦化:主要函数采用 switch-case 结构混淆控制流
  3. 动态反调试 :通过ptrace(PTRACE_TRACEME)/proc/self/status检查实现

关键函数定位

使用 IDA 的交叉引用追踪发现:

  • sub_80488A0处理核心校验逻辑
  • .data 段 末段存储着加密的 flag 比对数据
  • 通过 dlsym 动态获取了 libcrypto 的 AES 函数

解题思路

静态分析技巧

  1. IDA 脚本处理混淆

    import idaapi
    
    for func in Functions():
        if GetFunctionName(func).startswith('sub_'):
            MakeName(func, f"obf_func_{func:08X}")
            SetFunctionCmt(func, "Control flow flattened", 0)

  2. Ghidra 的 Decompiler 增强

  3. 手动定义自定义存储器区域对应 .obfusc
  4. 修正被破坏的函数原型

动态调试要点

  1. 反调试绕过

    # 使用 LD_PRELOAD 注入绕过 ptrace 检测
    gcc -shared -fPIC anti_antidebug.c -o inject.so
    export LD_PRELOAD=./inject.so

  2. 关键断点设置

    # 在算法交叉点下硬件断点
    watch -l *(uint32_t*)0x804C020
    catch syscall 0x101  # 拦截 gettimeofday

算法逆向过程

  1. 识别出采用 AES-128-CBC 模式
  2. 密钥通过 sha256(用户输入)[:16] 生成
  3. IV 向量隐藏在 .rodata 段的伪随机数中

代码示例

from Crypto.Cipher import AES
from hashlib import sha256

def decrypt_flag(enc_data: bytes, user_input: str) -> str:
    """
    :param enc_data: 从.data 段提取的密文(前 16 字节为 IV)
    :param user_input: 用户输入的字符串
    :return: 解密后的 flag
    """
    iv = enc_data[:16]
    ciphertext = enc_data[16:]

    # 重现密钥生成逻辑
    key = sha256(user_input.encode()).digest()[:16]

    cipher = AES.new(key, AES.MODE_CBC, iv)
    return cipher.decrypt(ciphertext).decode().strip('\x00')

避坑指南

反调试对抗方案

  • 时间检测 :Hook gettimeofday 返回固定值
  • 断点检测 :使用mprotect 临时修改代码段权限
  • 环境检测 :伪造/proc/self/status 的 TracerPid 字段

混淆代码分析

  1. 控制流图重建
  2. 使用 angr 符号执行标记有效路径
  3. 对 switch 变量进行污点追踪

  4. 垃圾代码识别

  5. 统计指令出现频率(NOP 类指令占比 >60% 可过滤)
  6. 观察寄存器依赖链断裂

效率优化

  • 对循环结构采用 Frida 动态插桩
  • 使用 Qiling 框架模拟执行敏感函数
  • 建立 IDA 的签名库加速分析

总结与思考

学习路径建议

  1. 基础阶段
  2. 《逆向工程核心原理》+ CrackMe 练习
  3. x86/ARM 指令集速查手册

  4. 进阶路线

  5. 参加 CTF 赛事积累实战经验
  6. 研究 VMProtect、Themida 等商业保护方案

工具链推荐

  • 静态分析:IDA Pro + Ghidra + Binary Ninja
  • 动态调试:GDB 增强版(PEDA/GEF)+
  • 辅助工具
  • Radare2(脚本化分析)
  • Unicorn(CPU 指令模拟)
  • LIEF(二进制修改)

通过这道赛题的完整分析,我们验证了逆向工程中 ” 动静结合 ” 原则的重要性。在实际工作中,往往需要根据目标特点灵活组合多种技术手段,建立系统化的分析思维比掌握单个工具更为关键。

正文完
 0
评论(没有评论)