N1CTF Junior re pyramid
字数 1218 2025-09-23 19:27:38

N1CTF Junior re pyramid 题目解析与教学

概述

本题是一个Python逆向题目,涉及多层嵌套结构:EXE -> PYC -> PYD -> 白盒AES加密。主要考察Python逆向、RC4密钥流爆破、白盒AES差分故障分析等技能。

解题步骤

第一步:EXE解包与PYC反编译

  1. 使用pyinstxtractor.py解包提供的EXE文件
  2. 获取chal.pyc文件
  3. 使用PyLingual等工具反编译PYC得到源代码

反编译后的主要逻辑:

import pyramid
import os

text = 'A pyramid fortified with intricate defenses looms before you. \nIts secrets are locked behind layers of puzzles. \nYou stand at its base, challenged to unravel them all.'
print('・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・')
for line in text.split('\n'):
    print(f'  {line}')
print('・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・')
a=input()
pyramid.a_long_way_to_treasure()
try:
    os.remove('checkinput.pyd')
except Exception as e:
    pass

第二步:分析PYD文件

  1. 使用IDA打开checkinput.pyd
  2. 定位pyramid.a_long_way_to_treasure()函数
  3. 发现动态解密逻辑:
    • 大字节数组(0x327B2长度)与密钥"bangdreamitsmygo"逐字节异或
    • 解密后得到新的PYC文件

解密代码示例:

# 手动提取数据并解密
large_data = [...]  # 从IDA中提取的0x327B2长度字节数组
key = b"bangdreamitsmygo"
decrypted = bytes([large_data[i] ^ key[i % len(key)] for i in range(len(large_data))])

第三步:解密后的PYC分析

解密后的文件具有PYC文件头特征(0xE3开头),反编译后得到真实逻辑:

  1. 用户输入作为key
  2. 使用FNV-1a(32-bit)哈希将key压缩为32位整数
  3. 通过ctypes调用advapi32的SystemFunction033(RC4加密)
  4. 使用RC4解密数据并加载为PYD文件

第四步:RC4密钥流爆破

已知条件:

  • 正常PYD文件头:b'\x4D\x5A\x90\x00'
  • 密文开头:b'\xb7\xc3\xbc\xe5'

爆破思路:

# 参考RC4暴力破解算法
for keystream_byte in range(256):
    if plaintext_byte ^ ciphertext_byte == keystream_byte:
        # 找到匹配的密钥流字节

最终得到密钥流:B7 BC 71 42

第五步:白盒AES分析

解密得到的PYD文件包含白盒AES加密:

  1. 识别白盒AES特征

    • 大型查找表
    • 复杂的字节置换操作
    • 多轮加密结构
  2. 差分故障分析(DFA)攻击

    • 在第8轮列混淆处设置断点
    • 修改单字节并观察输出差异
    • 收集正常密文和16个故障密文
  3. 使用工具

    • phoenixAES:进行DFA攻击
    • aes_keyschedule.c:计算轮密钥

攻击步骤:

# 安装phoenixAES
pip install phoenixAES

# 编译密钥计划工具
gcc -o aes_keyschedule aes_keyschedule.c
  1. 提取最后一轮轮密钥并反向推导得到原始AES密钥

第六步:最终解密

使用得到的AES密钥解密最终密文,获取flag。

关键技术点

  1. Python逆向技巧

    • PyInstaller解包
    • PYC反编译
    • PYD文件分析
  2. RC4密码分析

    • 已知明文攻击
    • 密钥流爆破
  3. 白盒密码分析

    • 识别白盒实现特征
    • 差分故障分析(DFA)
    • 轮密钥推导
  4. 工具使用

    • IDA Pro静态分析
    • 动态调试技巧
    • 专用密码分析工具

防护与加固建议

  1. 避免在代码中硬编码密钥
  2. 使用代码混淆技术
  3. 实现反调试机制
  4. 避免使用白盒密码实现
  5. 使用多层加密保护敏感逻辑

总结

本题展示了从外层包装到核心加密算法的完整逆向工程过程,涉及多种逆向技术和密码学分析方法。通过逐步剥离保护层,最终攻克白盒AES加密,体现了现代CTF题目中常见的多层防御体系破解方法。

掌握这些技术不仅有助于CTF竞赛,也对理解软件保护机制和密码学实现有重要意义。

N1CTF Junior re pyramid 题目解析与教学 概述 本题是一个Python逆向题目,涉及多层嵌套结构:EXE -> PYC -> PYD -> 白盒AES加密。主要考察Python逆向、RC4密钥流爆破、白盒AES差分故障分析等技能。 解题步骤 第一步:EXE解包与PYC反编译 使用 pyinstxtractor.py 解包提供的EXE文件 获取 chal.pyc 文件 使用PyLingual等工具反编译PYC得到源代码 反编译后的主要逻辑: 第二步:分析PYD文件 使用IDA打开 checkinput.pyd 定位 pyramid.a_long_way_to_treasure() 函数 发现动态解密逻辑: 大字节数组(0x327B2长度)与密钥"bangdreamitsmygo"逐字节异或 解密后得到新的PYC文件 解密代码示例: 第三步:解密后的PYC分析 解密后的文件具有PYC文件头特征(0xE3开头),反编译后得到真实逻辑: 用户输入作为key 使用FNV-1a(32-bit)哈希将key压缩为32位整数 通过ctypes调用advapi32的SystemFunction033(RC4加密) 使用RC4解密数据并加载为PYD文件 第四步:RC4密钥流爆破 已知条件: 正常PYD文件头: b'\x4D\x5A\x90\x00' 密文开头: b'\xb7\xc3\xbc\xe5' 爆破思路: 最终得到密钥流: B7 BC 71 42 第五步:白盒AES分析 解密得到的PYD文件包含白盒AES加密: 识别白盒AES特征 : 大型查找表 复杂的字节置换操作 多轮加密结构 差分故障分析(DFA)攻击 : 在第8轮列混淆处设置断点 修改单字节并观察输出差异 收集正常密文和16个故障密文 使用工具 : phoenixAES :进行DFA攻击 aes_keyschedule.c :计算轮密钥 攻击步骤: 提取最后一轮轮密钥 并反向推导得到原始AES密钥 第六步:最终解密 使用得到的AES密钥解密最终密文,获取flag。 关键技术点 Python逆向技巧 : PyInstaller解包 PYC反编译 PYD文件分析 RC4密码分析 : 已知明文攻击 密钥流爆破 白盒密码分析 : 识别白盒实现特征 差分故障分析(DFA) 轮密钥推导 工具使用 : IDA Pro静态分析 动态调试技巧 专用密码分析工具 防护与加固建议 避免在代码中硬编码密钥 使用代码混淆技术 实现反调试机制 避免使用白盒密码实现 使用多层加密保护敏感逻辑 总结 本题展示了从外层包装到核心加密算法的完整逆向工程过程,涉及多种逆向技术和密码学分析方法。通过逐步剥离保护层,最终攻克白盒AES加密,体现了现代CTF题目中常见的多层防御体系破解方法。 掌握这些技术不仅有助于CTF竞赛,也对理解软件保护机制和密码学实现有重要意义。