[GWCTF 2019]pyre

Python的逆向, 采用uncompyle6进行"反编译"

uncompyle6: Github

安装很简单, 直接用pip安装就可以了(pip建议先换源)

1
pip install uncompyle6

使用也简单, 比如要反编译test.pyc输出到decompile.py文件

1
uncompyle6 -o decompile.py test.pyc
image-20220123180336910

反编译出来的Python代码有些问题, 还是Python2的, 不过出题人的意图很明显, 最下面的code应该是input1经过两次变换后的结果, 要用它逆推出input1.

image-20220123181846852

可以对每一位穷举, 照着这个代码里的变换规则来就行, 解密代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <cstdio>

using namespace std;

int main()
{
char arr[] = { '\x1f', '\x12', '\x1d', '(', '0', '4', '\x01', '\x06', '\x14', '4', ',', '\x1b', 'U', '?', 'o', '6', '*', ':', '\x01', 'D', ';', '%', '\x13' };
char result[64] = { 0 };
for (int i = sizeof(arr) - 2; i >= 0; i--) //先进行一次异或,初步还原内容
arr[i] = arr[i] ^ arr[i + 1];
for (int i = 0; i < sizeof(arr); i++)
for (int j = 32; j < 127; j++) //穷举所有可打印ASCII字符
if (((j + i) % 128 + 128) % 128 == arr[i])
result[i] = j;
printf("%s", result);
}
//GWHT{Just_Re_1s_Ha66y!}

所以flag就是flag{Just_Re_1s_Ha66y!}