Crypto_XCTF_WriteUp | easychallenge

发布时间 2023-11-18 09:55:16作者: Guanz

题目

一个 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()用法及代码示例-纯净天空