从 Exeinfo PE 的识别结果来看,文件 re4 是 PYO 格式(Python 优化编译后的字节码文件 ),不是常规的 PE 可执行程序(Windows EXE )。由 Python 脚本编译生成(python -O script.py 命令会生成 .pyo ),比 .pyc 更小、加载更快,但可读性低。


这样提示文件打开是空白的

这是正确的

==要把文件后缀改成pyc==

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import base64

def encode(message):
s = ''
for i in message:
x = ord(i) ^ 32
x = x + 16
s += chr(x)

return base64.b64encode(s)


correct = 'XlNkVmtUI1MgXWBZXCFeKY+AaXNt'
flag = ''
print 'Input flag:'
flag = raw_input()
if encode(flag) == correct:
print 'correct'
else:
print 'wrong'

代码分析

这个程序定义了一个encode函数,对输入字符串进行处理:

  1. 每个字符的 ASCII 值与 32 进行异或操作
  2. 结果加 16
  3. 将处理后的字符组合成新字符串
  4. 对新字符串进行 Base64 编码
    最后将编码结果与预定义的correct值进行比较。我们需要逆向这个过程来找到原始的 flag。

逆向过程

要还原 flag,我们需要反向执行上述步骤:

  1. 对 Base64 编码进行解码
  2. 每个字符减 16
  3. 与 32 进行异或操作
    下面是逆向的 Python 代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import base64 
correct = 'XlNkVmtUI1MgXWBZXCFeKY+AaXNt'
# 第一步:Base64解码
decoded = base64.b64decode(correct)
# 第二步:逆向处理每个字符
flag = ''
for c in decoded:
# Python3中需要处理字节对象
if isinstance(c, int):
x = c
# Python2中需要处理字节对象
else:
x = ord(c)
x = x - 16
x = x ^ 32
flag += chr(x)
print("Flag:", flag)

nctf{d3c0mpil1n9_PyC}