2020年「羊城杯」网络安全大赛 Re部分 WriteUp
Re
login
使用 PyInstaller Extractor v2.0把exe进行解包, 在解包指令中发现 Python version: 36, 切换到python3.6环境中
可以看见入口文件为 login.pyc, 使用 uncompyle6 login.pyc解析pyc文件
看到一堆数字, 嗯, 又是方程组, 上z3
1 | |
按照 ord(input1[i]) ^ ord(input1[i + 1])进行异或, 反推回input [85, 95, 71, 48, 55, 95, 116, 104, 51, 95, 107, 51, 121, 33], 转换为字符串
1 | |
easyre
IDA查看整体逻辑, 发现是flag经过 encode_one encode_two encode_three三次编码后变成 EmBmP5Pmn7QcPU4gLYKv5QcMmB3PWHcP5YkPq3=cT6QckkPckoRG, 首先怀疑有base64
查看 `encode_one`, 看到一个变量 `alphabet`, 对应的 `ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/`, 不用怀疑就是 `base64`,

查看 encode_two, 看到4个 strncpy用法, 分析后可画出此图


查看 encode_three, 貌似很复杂的样子, 画出数轴, 分析后画出此图

先还原 encode_three, 我突然想到这是一一对应的关系, 把这个关系写出来然后生成一张map就行了
1 | |
还原 encode_two, 参照画的图对原来的字符串进行还原, 最后base64解码
1 | |
Bytecode
第一次遇到这种题目, Bytecode为python的字节码转换成人类可读的形式, 当smail来读就行, 还原成python脚本
1 | |
1 | |
首先分析第一段, 其实根据常识即可知道应该是 GWHT{, 带入后正确
1 | |
第二段分析, 可知为从第5位开始, 每两位进行某种异或运算, 而且其取值仅和output有关, 和前面和后面无关, 只有两位进行爆破即可
1 | |
第三段, 又双叒叕是方程组, 这次怎么这么喜欢出方程组, z3直接解
1 | |
最后拼接一下cfa2b87b3f746a8f0ac5c5963faeff73