imnotavirus
先看到 main.exe
,使用DIE发现有UPX壳,
1 | upx.exe -d main.exe |
根据另一个文件夹 pyinstaller-4.2
,可知这是一个pyinstaller打包成的EXE。使用pyinstxtractor解包:
1 | python3 pyinstxtractor.py main.exe |
可能会观察到类似类似下面的字样:
1 | [!] Error: Failed to decompress xxxxx.pyc, probably encrypted. Extracting as is. |
作为一个决赛当然不会让我们直接看到pyc文件= =,这应该是使用了pyinstaller
里的加密功能。
看一看 pyinstaller
里的pyimod02_archive.py
所定义的Cipher
类:
1 | class Cipher(object): |
再看看 PyiBlockCipher
类:
1 | class PyiBlockCipher(object): |
最后是writer.py
里的代码片段:
1 | obj = zlib.compress(data, self.COMPRESSION_LEVEL) |
重点:AES、key、iv、CRYPT_BLOCK_SIZE(16)、zlib
出题人特意考察了代码审计(但我感觉是信息搜集23333),可以直接在pyinstaller
源码基础上实现解密,但是因为这个解密方法比较简单,我们直接写一个脚本:
1 | def decrypt_pyc(): |
得到sign.pyc
已经成功百分之五十,使用HxD修改文件前16个字节为55 0D 0D 0A 00 00 00 00 DA 73 8F 60 0A 12 00 00
,反编译pyc:
1 | uncompyle6.exe .\sign.pyc |
得到的反编译结果如下:
1 | # uncompyle6 version 3.7.4 |
首先对最长的base64密文进行解密,再RC4解密,得到的其实包含了机器指令,我们写一个脚本将其dump出来:
1 | def get_binary(): |
IDA打开:
1 | push rbp |
分割线上面的汇编是一个SMC,我在py脚本提前处理了。分割线下面的是真实的加密算法。
解密脚本如下:
1 | def get_flag(): |
完成。