文章目录
- 前言
- 一、easychallenge
- 二、使用步骤
- 1.uncompyle6
- 2.解密py文件
- 总结
前言
题目描述:你们走到了一个冷冷清清的谜题前面,小鱼看着题目给的信息束手无策,丈二和尚摸不着头脑 ,你嘿嘿一笑,拿出来了你随身带着的笔记本电脑,噼里啪啦的敲起来了键盘,清晰的函数逻辑和流程出现在 了电脑屏幕上,你敲敲键盘,更改了几处地方,运行以后答案变出现在了电脑屏幕上。
提示:以下是本篇文章正文内容,下面案例可供参考
一、easychallenge
题目链接:https://adworld.xctf.org.cn/task/answer?type=crypto&number=5&grade=0&id=5109&page=1
二、使用步骤
1.uncompyle6
发现是一个.pyc文件
需要反编译成py文件
uncompyle6是一个原生python的跨版本反编译器和fragment反编译器,是decompyle、uncompyle、uncompyle2等的接替者
代码语言:javascript复制pip install uncompyle6
uncompyle6 -o . test.pyc
得到py代码如下:
代码语言:javascript复制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'
流程分析
encode1函数是把输入的字符串分割成单独的字符,先转换为ascii数值,再与36异或,然后 25,接着转回字符,最后拼接为新的字符串输出。因此对应的decode1函数应该是先-25,再与36异或(异或的逆操作还是异或)。encode2函数是把输入的字符串分割成单独的字符,先转换为ascii数值,再 36,然后与36异或,接着转回字符,最后拼接为新的字符串输出。因此对应的decode2函数应该是先与36异或,再-36。encode3函数是调用base64库里的b32encode()函数进行base32运算。因此对应的decode3函数应该是base64.b32decode()。
2.解密py文件
代码语言:javascript复制import base64
def decode1(ans):
s = ''
for i in ans:
x = ord(i) - 25
x = x ^ 36
s = chr(x)
return s
def decode2(ans):
s = ''
for i in ans:
x = i^ 36
x = x - 36
s = chr(x)
return s
def decode3(ans):
return base64.b32decode(ans)
final = 'UC7KOWVXWVNKNIC2XCXKHKK2W5NLBKNOUOSK3LNNVWW3E==='
flag=decode1(decode2(decode3(final)))
print(flag)
得到对应的flag为cyberpeace{interestinghhhhh}
总结
- uncompyle6