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_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