Crypto_XCTF_WriteUp | easychallenge
题目
一个 pyc 文件(……不知道怎么形容
分析
用 txt 格式打开是一串半人半鱼的……一串夹着一点点编程语言的乱码,必应了一下是 python 运行后生成的字节码文件。
直接运行出现报错:
提示 pyc 文件中的 magic number 错误,可能是 python 版本不匹配或者文件损坏导致。于是安装 uncompyle(之前安装了一部分报错,下图最后的一部分),对文件进行反编译查看源代码:
得到的 py 文件:
# uncompyle6 version 3.9.0
# Python bytecode version base 2.7 (62211)
# Decompiled from: Python 3.10.9 | packaged by Anaconda, Inc. | (main, Mar 1 2023, 18:18:15) [MSC v.1916 64 bit (AMD64)]
# Embedded file name: ans.py
# Compiled at: 2018-08-09 11:29:44
import base64
def encode1(ans):
s = ''
for i in ans:
x = ord(i) ^ 36
x = x + 25
s += chr(x)
return s
def encode2(ans):
s = ''
for i in ans:
x = ord(i) + 36
x = x ^ 36
s += chr(x)
return s
def encode3(ans):
return base64.b32encode(ans)
flag = ' '
print 'Please Input your flag:'
flag = raw_input()
final = 'UC7KOWVXWVNKNIC2XCXKHKK2W5NLBKNOUOSK3LNNVWW3E==='
if encode3(encode2(encode1(flag))) == final:
print 'correct'
else:
print 'wrong'
可以看到输入的 flag 经过三次加密后再与 UC7KOWVXWVNKNIC2XCXKHKK2W5NLBKNOUOSK3LNNVWW3E===
比较,若相同则通过。
根据反编译出的代码,我们逆着加密步骤写出 python3 版本的解密算法:
import base64
def decode3(s):
return base64.b32decode(s)
def decode2(s):
ans = ''
for i in s:
ans += chr((i ^ 36) - 36)
return ans
def decode1(s):
ans = ''
for i in s:
ans += chr((ord(i) - 25) ^ 36)
return ans
print(decode1(decode2(decode3('UC7KOWVXWVNKNIC2XCXKHKK2W5NLBKNOUOSK3LNNVWW3E==='))))
运行即可得到 flag。
Flag
cyberpeace{interestinghhhhh}
参考
pyc文件究竟是用来干什么的?-Ejasmine-CSDN
bad magic number in .pyc file-CSDN文库
如何反编译pyc文件查看源代码-偷一个月亮-CSDN
Python 基础教程-菜鸟教程
base64(Internet Data)-Python中文开发手册-开发者手册-腾讯云开发者社区-腾讯云
python3遇到的"ord() expected string of length 1, but int found"问题-thinszx-CSDN
Python base64.b32decode()用法及代码示例-纯净天空