
1、下载附件后是一个.pyc的文件,很明显这是python的编译文件,拿到在线反编译的网站上进行反编译即可得到源码。这里给出反编译网站及源码。
import platform
import sys
import marshal
import types
def check(s):
f = '2(88\x006\x1a\x10\x10\x1aIKIJ+\x1a\x10\x10\x1a\x06'
if len(s) != len(f):
return False
checksum = None
for a, b in zip(f, s):
checksum += ord(b) ^ ord(a) ^ 123
return checksum == 0
if sys.version_info.major != 2 or sys.version_info.minor != 7:
sys.exit('\xe8\xaf\x95\xe8\xaf\x95 Python 2.7.') #试试python 2.7
if len(sys.argv) != 2:
sys.exit('usage: bronze.pyc <flag>')
flag = sys.argv[1]
if len(flag) >= 32:
print ('too long.') #太长了
sys.exit(1)
alphabet = set('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789{}!@#$%+')
for ch in flag:
if ch not in alphabet:
print ('\xe4\xb8\x8d\xe5\xaf\xb9.' ) #不对
sys.exit(1)
continue
if check(flag):
print ('\xe5\xb0\xb1\xe6\x98\xaf\xe8\xbf\x99\xe4\xb8\xaa!') #就是这个
sys.exit(0)
else:
print ('\xe6\x90\x9e\xe9\x94\x99\xe4\xba\x86.') #搞错了
sys.exit(1)
2、注意到check()函数的功能是校对flag的,所以关键信息就在check()函数中。
3、下面这段代码是将输入的字符串和flag逐个比较后将其ASCII码按异或运算后保存在checksum中。
for a, b in zip(f, s):
checksum += ord(b) ^ ord(a) ^ 123
这个是Python中zip()函数的作用。
4、根据第三步可以得知如果输入的每个字符都和对应的(rod(a)^123)相同,则该字符串即为flag,于是我们可以直接求rod(a)与123的异或结果即可得出flag的ASCII码。求解代码如下:
for a in '2(88\x006\x1a\x10\x10\x1aIKIJ+\x1a\x10\x10\x1a\x06':
b=ord(a)^123
print(b)
结果如下:
73
83
67
67
123
77
97
107
107
97
50
48
50
49
80
97
107
107
97
125
5、将上面的ASCII码转换成字符即可得到flag,这里给出 flag。
ISCC{Makka2021Pakka}
版权声明:本文为qq_42667177原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。