ISCC2021-REVERSE_Garden -WP

在这里插入图片描述
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版权协议,转载请附上原文出处链接和本声明。