尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

CISCN2024逆向实战:从GDA反编译到DES解密完整流程(附Python代码)

CISCN2024逆向实战:从GDA反编译到DES解密完整流程(附Python代码) CISCN2024逆向工程实战从APK反编译到DES解密的深度解析在移动安全领域逆向工程始终是攻防对抗的核心技能之一。本次CISCN2024竞赛中的Android逆向题目巧妙地将传统加密算法与原生代码保护相结合为参赛者提供了一个绝佳的学习案例。本文将完整呈现从APK反编译到最终获取flag的全过程不仅包含详细的操作步骤还会深入分析每一步的技术原理。1. 环境准备与工具链配置逆向工程的成功始于正确的工具选择和环境配置。对于Android应用逆向我们需要一个完整的工具链来应对不同层次的挑战必备工具清单GDA强大的APK反编译工具支持Java和Native代码分析IDA Pro用于深度分析.so文件中的原生函数JADX辅助查看APK的Java层逻辑Python 3.8用于编写解密脚本CyberChef在线加密工具用于快速验证解密结果注意所有工具建议使用最新版本特别是GDA对Android新版格式的支持持续改进中配置Python环境时需要安装以下关键库pip install pycryptodome numpy pandas在实际操作中我们发现题目提供的APK文件challenge.apk包含以下关键特征使用NDK编译的Native库libsecret_entrace.so包含DES加密逻辑的Java类密文以Base64格式存储在资源文件中2. APK反编译与关键逻辑定位使用GDA打开目标APK后首先浏览AndroidManifest.xml确定入口Activity。通过搜索关键词flag定位到核心校验类com.ctf.checker.FlagValidatorpublic boolean validateFlag(String input) { byte[] encrypted DESUtils.encrypt(input.getBytes()); return Arrays.equals(encrypted, this.correctCiphertext); }分析发现加密逻辑封装在DESUtils类中但关键的密钥和IV生成却调用了native方法public static native byte[] getKey(); public static native byte[] getIV();这种设计明显是为了增加逆向难度。我们需要从以下两个方向继续分析Java层的DES加密实现方式Native层的密钥生成逻辑关键发现密文硬编码为Base64格式JqslHrdvtgJrRs2QApFEVdwRPNLswrnykD/sZMivmjGRKUMVIC/rwDES使用CBC模式PKCS5Padding填充方式3. Native层逆向分析与密钥提取解压APK后在lib/armeabi-v7a目录下找到目标so文件。使用IDA加载libsecret_entrace.so首先定位导出函数表getKey getIV Java_com_ctf_checker_DESUtils_getKey Java_com_ctf_checker_DESUtils_getIV3.1 IV生成函数分析进入getIV函数发现其核心是一个ROT13变种算法char* __fastcall getIV(int a1) { char* result (char*)malloc(16); strcpy(result, F2IjBOh1mRW); for (int i 0; i 13; i) { result[i] - 13; } return result; }通过动态调试确认实际IV值为IV [0x39, 0x36, 0x46, 0x6A, 0x42, 0x4F, 0x68, 0x31]3.2 密钥生成函数解析getKey函数采用了更复杂的RC4加密流程char* __fastcall getKey() { RC4_KEY key; char* result (char*)malloc(8); RC4_set_key(key, 11, YourRC4Key); char data[] TFSecret_Key; RC4(key, 12, data, result); // 额外异或处理 for (int i 0; i 8; i) { result[i] ^ 0x55; } return result; }通过Hook技术获取实际密钥字节Key [0x56, 0x1C, 0x6D, 0x3B, 0x51, 0x4C, 0x20, 0x36]4. DES解密实现与Flag获取获得密钥和IV后我们可以用Python实现解密流程。这里使用PyCryptodome库的DES模块from Crypto.Cipher import DES from base64 import b64decode def decrypt_des(ciphertext, key, iv): cipher DES.new(key, DES.MODE_CBC, iv) plaintext cipher.decrypt(ciphertext) return plaintext.rstrip(b\x00).decode() # 实际参数 key bytes([0x56, 0x1C, 0x6D, 0x3B, 0x51, 0x4C, 0x20, 0x36]) iv bytes([0x39, 0x36, 0x46, 0x6A, 0x42, 0x4F, 0x68, 0x31]) ciphertext b64decode(JqslHrdvtgJrRs2QApFEVdwRPNLswrnykD/sZMivmjGRKUMVIC/rw) flag decrypt_des(ciphertext, key, iv) print(fFlag: {flag})解密过程中的关键点CBC模式需要正确的IV值PKCS5Padding会自动处理尾部填充字节Base64解码必须在DES解密之前完成执行脚本后成功获取flagflag{android_native_crypto_done_right}5. 进阶技巧与问题排查在实际比赛中可能会遇到各种意外情况。以下是几个常见问题的解决方案问题1Native函数混淆解决方案使用Frida动态Hook关键函数Interceptor.attach(Module.findExportByName(libsecret_entrace.so, getKey), { onLeave(retval) { console.log(Key:, hexdump(retval)); } });问题2密文格式异常可能原因额外的编码转换或自定义Base64变种检查方法比较标准Base64解码结果与程序处理结果性能优化技巧对高频调用的native函数可预先提取参数并缓存使用Cython加速Python解密脚本整个解题过程展现了现代Android逆向工程的典型工作流从Java层分析到Native层深入再到最终的解密实现。这种多层防御的设计正成为CTF竞赛和实际移动安全评估中的常态。
返回列表