[CTF逆向实战] 从UPX脱壳到PyC反编译:两道“白给”Flag的逆向通关实录
1. UPX脱壳实战从壳中揪出Flag第一次拿到这道带UPX壳的Windows程序时我差点笑出声——这简直就是CTF界的新手大礼包。UPX壳作为最基础的压缩壳识别起来特别容易。用PEiD或者Detect It Easy这类工具扫一眼就能看到醒目的UPX标识。不过新手容易犯的错误是看到壳就急着脱结果把程序搞崩溃了。我习惯先用x32dbg载入程序在入口点下断。这时候你会看到典型的UPX特征一堆pushad指令开头结尾跟着popad和jump。这时候别急着运行先记下跳转地址。用命令行工具upx -d是最稳妥的脱壳方式upx -d target.exe -o unpacked.exe脱完壳用IDA Pro打开直接搜索字符串成功了。这个技巧在CTF逆向中特别实用——程序总要给用户反馈而这些字符串往往就在关键判断逻辑附近。果然我们找到了TForm1_Button1Click函数里面的逻辑直白得感人if ( Sysutils::CompareStr(v5, str_HackAv[1]) ) Dialogs::ShowMessage((Dialogs *)str_____[1], v1); else Dialogs::ShowMessage((Dialogs *)str______[1], v1);看到CompareStr这个函数调用没它直接把用户输入和硬编码字符串HackAv做比较连加密都懒得加。这种题就是教你要养成搜索字符串的好习惯。最后用flag{}包裹比较字符串轻松拿到第一分flag{HackAv}2. PyC反编译的障眼法第二题是个Python字节码文件(.pyc)反编译出来的代码看着像天书。这里推荐使用uncompyle6或者在线工具https://tool.lu/pyc/。我最初看到这段代码时也懵了def encode(origin_bytes): c_bytes [{:08}.format(str(bin(b)).replace(0b, )) for b in origin_bytes] resp nums len(c_bytes) // 3 remain len(c_bytes) % 3 integral_part c_bytes[0:3 * nums] for x in [0,6,12,18]: # 这段直接continue了没用 continue关键技巧是遇到看不懂的函数先跳过找程序最后对flag的处理。我注意到有个rend()函数在操作字符串里面有个位移操作def rend(s): def encodeCh(ch): f lambda x: chr(((ord(ch) - x) 2) % 26 x) if ch.islower(): return f(97) if (None,).isupper(): return f(65) return (.join,)((lambda .0: pass)(s))这明显是个凯撒密码变种每个字母位移2位。于是先写解码函数def decodeCH(ch): f lambda x: chr(((ord(ch) - x) 24) % 26 x) # 24等价于-2 if ch.islower(): return f(97) if ch.isupper(): return f(65) return ch对flag字符串BozjB3vlZ3ThBn9bZ2jhOH93ZaH9逐字符处理得到ZmxhZ3tjX3RfZl9zX2hfMF93XyF9。老司机一眼就认出这是Base64编码的flag{开头用Python的base64库解码from base64 import b64decode print(b64decode(ZmxhZ3tjX3RfZl9zX2hfMF93XyF9)) # 输出bflag{c_t_f_s_h_0_w_!}3. 逆向工程的思维训练这两道题看似简单实则包含了逆向工程的经典思维模式。第一题教会我们字符串即真理——程序总要输出信息这些字符串就是最好的路标。我参加过的CTF比赛中至少有30%的逆向题可以通过字符串搜索直接或间接找到flag。第二题则演示了由果溯因的分析方法。当面对复杂逻辑时先看最终输出形式逆向追踪数据处理流程重点分析加密/编码函数优先处理已知算法如Base64、凯撒密码等PyC反编译经常会出现反人类代码这时候要善用Python的交互式环境做实验。比如那个看似无用的for x in [0,6,12,18]循环实际运行时发现根本不会执行这就是反编译工具的常见问题。4. 工具链的实战配置工欲善其事必先利其器。经过多次CTF实战我总结出一套高效的工具组合Windows逆向套装查壳PEiD/Detect It Easy脱壳UPX官方工具/手动脱壳调试x32dbg/x64dbg静态分析IDA Pro免费版/GhidraPython逆向套装反编译uncompyle6/pycdc字节码分析dis模块动态调试pdb/IPython特别推荐配置一个Python沙盒环境专门用于快速验证算法猜想。比如第二题的凯撒密码我就是先在IPython里试出了正确的位移参数。有时候看似复杂的加密可能就是标准算法的微小变种。