京麒CTF2025 热身赛 RE
字数 1518 2025-08-29 22:41:10

Rust逆向分析与加密算法解析

1. RE1 - Rust逆向分析

1.1 题目概述

这是一个Rust编写的逆向题目,符号表已被删除,需要通过动态调试来分析加密逻辑。

1.2 加密逻辑分析

加密过程主要包含以下关键点:

  1. 密钥流生成:密钥流与输入的前两个明文字符(v29)有关
  2. 加密操作:对密文进行简单的异或操作
  3. 密钥流特点:密钥流的生成逻辑可以逆向推导

1.3 解题方法

两种可行的解题路径:

  1. 动态调试法

    • 跟踪程序执行流程
    • 直接获取v35的值(密钥流)
    • 进行异或解密
  2. 静态分析法

    • 逆向密钥流生成逻辑
    • 仿写密钥流生成算法
    • 使用生成的密钥流进行异或解密

1.4 示例flag

flag{1c98572d-7f7b-4fbf-8750-4a2986c695ce}

2. RE2 - SIMD指令分析

2.1 题目概述

该题目使用了SIMD指令集进行加密操作,主要涉及两个关键指令。

2.2 关键指令分析

  1. _mm_add_epi8

    • 功能:对两个参数进行逐字节相加
    • 特点:相对简单直接的加法操作
  2. _mm_shuffle_epi8

    • 功能:以第二个参数作为索引,从第一个参数中取值
    • 特点:实现数据重排(shuffle)
    • 注意事项:
      • 参数传递采用小端序
      • 若不注意字节序,可能导致打乱前后无明显区别

2.3 解题要点

  • 理解SIMD指令的行为
  • 注意小端序的影响
  • 逆向shuffle操作需要还原索引映射关系

2.4 示例flag

flag{cdb0444318e24beb8f374e9181599072}

3. RE3 - iOS逆向分析

3.1 题目概述

iOS平台逆向题目,涉及多层加密逻辑。

3.2 关键函数分析

  1. ViewController.init

    • 初始化密钥:"Haruhikage"
    • 注意:伪代码中密钥可能不完整,实际可能还有两位
  2. ViewController.encryptButtonClicked()

    • 主要校验逻辑所在处
    • 检查输入flag是否为空
    • 调用多层加密函数
  3. 加密流程

    RC4 → base64 → obfuscateString → transformString
    

3.3 加密函数详解

3.3.1 transformString函数

  • 主要逻辑:异或操作
  • 特殊处理:
    • 异或后有一个特殊逻辑(需要分析)
    • 涉及__clz()函数(前导零计数)
  • 可疑字符串格式:c2..c3..
    • c3开头的在解密时需要减去0x40

3.3.2 obfuscateString函数

加密逻辑:

(索引index + 常数0xDEADBEEF) & 0xFF

3.4 解密流程

  1. 逆向transformString的特殊处理
  2. 处理c2/c3前缀的字符串
  3. 逆向obfuscateString的加密
  4. Base64解码
  5. RC4解密

3.5 示例flag

flag{N4nd3_H4ruhik4g3_Y4tt4n0?!!}

3.6 中间结果示例

YWRiZTI5NzkzNTg3OTgzMDhjOTExZGQ0NjQ3YTJmNmExM2MwNDJjYzMyNDU5N2UxZWRiYzA4OWE5ZTkwMTVmYmE5

4. 通用逆向技巧总结

  1. 动态调试

    • 适用于符号表被删除的情况
    • 可获取运行时数据
  2. 加密算法识别

    • 注意常见算法特征(如RC4、base64)
    • 识别自定义加密逻辑
  3. 数据处理

    • 注意字节序问题(小端序/大端序)
    • 注意特殊处理逻辑(如c3前缀的特殊处理)
  4. 逆向工程工具

    • 使用合适的反编译器
    • 结合静态分析和动态调试
  5. 脚本编写

    • 仿写加密逻辑进行逆向
    • 注意编程语言特性(如Rust的内存安全特性可能影响逆向)

5. 附录:关键函数伪代码

5.1 transformString伪代码

func transformString(input: String) -> String {
    // 异或操作
    let xorResult = input.map { $0 ^ key }
    
    // 特殊处理
    if condition {
        // 涉及__clz()的处理
    }
    
    // 处理c2/c3前缀
    if prefix == "c3" {
        value -= 0x40
    }
    
    return result
}

5.2 obfuscateString伪代码

func obfuscateString(input: String) -> String {
    return input.enumerated().map { (index, char) in
        (index + 0xDEADBEEF) & 0xFF
    }
}
Rust逆向分析与加密算法解析 1. RE1 - Rust逆向分析 1.1 题目概述 这是一个Rust编写的逆向题目,符号表已被删除,需要通过动态调试来分析加密逻辑。 1.2 加密逻辑分析 加密过程主要包含以下关键点: 密钥流生成 :密钥流与输入的前两个明文字符(v29)有关 加密操作 :对密文进行简单的异或操作 密钥流特点 :密钥流的生成逻辑可以逆向推导 1.3 解题方法 两种可行的解题路径: 动态调试法 : 跟踪程序执行流程 直接获取v35的值(密钥流) 进行异或解密 静态分析法 : 逆向密钥流生成逻辑 仿写密钥流生成算法 使用生成的密钥流进行异或解密 1.4 示例flag flag{1c98572d-7f7b-4fbf-8750-4a2986c695ce} 2. RE2 - SIMD指令分析 2.1 题目概述 该题目使用了SIMD指令集进行加密操作,主要涉及两个关键指令。 2.2 关键指令分析 _ mm_ add_ epi8 : 功能:对两个参数进行逐字节相加 特点:相对简单直接的加法操作 _ mm_ shuffle_ epi8 : 功能:以第二个参数作为索引,从第一个参数中取值 特点:实现数据重排(shuffle) 注意事项: 参数传递采用小端序 若不注意字节序,可能导致打乱前后无明显区别 2.3 解题要点 理解SIMD指令的行为 注意小端序的影响 逆向shuffle操作需要还原索引映射关系 2.4 示例flag flag{cdb0444318e24beb8f374e9181599072} 3. RE3 - iOS逆向分析 3.1 题目概述 iOS平台逆向题目,涉及多层加密逻辑。 3.2 关键函数分析 ViewController.init : 初始化密钥:"Haruhikage" 注意:伪代码中密钥可能不完整,实际可能还有两位 ViewController.encryptButtonClicked() : 主要校验逻辑所在处 检查输入flag是否为空 调用多层加密函数 加密流程 : 3.3 加密函数详解 3.3.1 transformString函数 主要逻辑:异或操作 特殊处理: 异或后有一个特殊逻辑(需要分析) 涉及 __clz() 函数(前导零计数) 可疑字符串格式: c2..c3.. 等 c3 开头的在解密时需要减去 0x40 3.3.2 obfuscateString函数 加密逻辑: 3.4 解密流程 逆向transformString的特殊处理 处理 c2 / c3 前缀的字符串 逆向obfuscateString的加密 Base64解码 RC4解密 3.5 示例flag flag{N4nd3_H4ruhik4g3_Y4tt4n0?!!} 3.6 中间结果示例 YWRiZTI5NzkzNTg3OTgzMDhjOTExZGQ0NjQ3YTJmNmExM2MwNDJjYzMyNDU5N2UxZWRiYzA4OWE5ZTkwMTVmYmE5 4. 通用逆向技巧总结 动态调试 : 适用于符号表被删除的情况 可获取运行时数据 加密算法识别 : 注意常见算法特征(如RC4、base64) 识别自定义加密逻辑 数据处理 : 注意字节序问题(小端序/大端序) 注意特殊处理逻辑(如 c3 前缀的特殊处理) 逆向工程工具 : 使用合适的反编译器 结合静态分析和动态调试 脚本编写 : 仿写加密逻辑进行逆向 注意编程语言特性(如Rust的内存安全特性可能影响逆向) 5. 附录:关键函数伪代码 5.1 transformString伪代码 5.2 obfuscateString伪代码