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()用法及代码示例-纯净天空
本文作者:Guanz的博客
本文链接:https://www.cnblogs.com/Guanz/p/17839958.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步