BUUCTF pyre
拿到的文件是一个后缀是.pyc的文件,有点迷糊,百度了一下发现可以用网上的python反编译在线工具反编译,反编译之后得到代码:
#!/usr/bin/env python
# visit http://tool.lu/pyc/ for more information
print "Welcome to Re World!"
print "Your input1 is your flag~"
l = len(input1)
for i in range(l):
num = ((input1[i] + i) % 128 + 128) % 128
code += num
for i in range(l - 1):
code[i] = code[i] ^ code[i + 1]
print code
code = [
"\x1f",
"\x12",
"\x1d",
"(",
"0",
"4",
"\x01",
"\x06",
"\x14",
"4",
",",
"\x1b",
"U",
"?",
"o",
"6",
"*",
":",
"\x01",
"D",
";",
"%",
"\x13",
]
分析了下代码,大概猜测就是自己输入一个flag,然后经过两次变换得到另一个flag
代码比较简单,直接上脚本:
code = [
"\x1f",
"\x12",
"\x1d",
"(",
"0",
"4",
"\x01",
"\x06",
"\x14",
"4",
",",
"\x1b",
"U",
"?",
"o",
"6",
"*",
":",
"\x01",
"D",
";",
"%",
"\x13",]
l = len(code)
for i in range(l-2,-1,-1):
code[i]=chr(ord(code[i])^ord(code[i+1]))
for i in range(len(code)):
print(chr((ord(code[i])-i)%128),end='')
运行得到flag:
总结:
1.《.pyc》的python文件可以用网页python反编译在线工具反编译
2.因为(a+b)%c=(a%c+b%c)%c,所以原程序中((input1[i] + i) % 128 + 128) % 128=(input1[i] + i) %128,如下图:
3.a=(b-c)%d的逆运算为b=(a+c)%d