下载解压文件后,找到了flag.txt。打开后,解压后空欢喜一场。
用010edit打开flag.rar文件,查看一下。发现flag.txt 文件内容很少,为什么里边的内容这么多,仔细观察发现有一个flag.pyc。
下一步就是如何把flag.pyc文件提取出来,首先了解一下 rar 文件结构。
rar 是由一个一个 block 组成的,每个 block 有以下几个部分
HEAD_CRC 2 全部块或块部分的CRC
HEAD_TYPE 1 块类型
HEAD_FLAGS 2 阻止标志
HEAD_SIZE 2 块大小
ADD_SIZE 4 可选字段 - 添加块大小
手动将 block[1] 的HEAD_TYPE改成 file or directory
然后解压会报错但是可以解压成功,解压后需要将STM改为STM.pyc(应该也可以不改)如下:
科普一下:.pyc文件是将.py形式的程序编译成中间式文件(byte-compiled)。这么做的目的就是为了加快下次执行文件的速度。所以,在我们运行python文件的时候,就会自动首先查看是否具有.pyc文件,如果有的话,而且.py文件的修改时间和.pyc的修改时间一样,就会读取.pyc文件,否则,Python就会读原来的.py文件。其实并不是所有的.py文件在与运行的时候都会产生.pyc文件,只有在import相应的.py文件的时候,才会生成相应的.pyc文件
在线反编译(https://tool.lu/pyc/)得到.py文件。
# !/usr/bin/env python
# encoding: utf-8
# 如果觉得不错,可以推荐给你的朋友!http://tool.lu/pyc
import base64
def encode():
flag = '*************'
ciphertext = []
for i in range(len(flag)):
s = chr(i ^ ord(flag[i]))
if i % 2 == 0:
s = ord(s) + 10
else:
s = ord(s) - 10
ciphertext.append(str(s))
return ciphertext[::-1]
ciphertext = [ '96', '65', '93', '123', '91','97','22','93','70','102', '94','132','46','112','64','97','88','80','82',
'137','90','109','99','112']
根据 encode 编写 decode 代码
def decode(ciphert):
ciphert = ciphert[:: -1]
flag = ""
for i, v in enumerate(ciphert):
s = int(v)
if i % 2 == 0:
s2 = chr(s - 10)
else:
s2 = chr(s + 10)
s3 = chr(ord(s2) ^ i)
# print(s, s2, s3)
flag += s3
print(flag)
得到flag如下: