攻防世界easychallenge

攻防世界easychallenge

python相关知识

ord('a')=97

chr(97)=a

^:是指异或运算

1^0=1

1^1=1

image-20220509142225492

题目附件下载下来:是一个pyc文件
image
为了方便,后面改成test.pyc

经过搜索发现:

pyc是一种二进制文件,是由py文件经过编译后,生成的文件,是一种byte code,py文件变成pyc文件后,加载的速度有所提高,并且编译为pyc文件之后,可以防止源码泄露,所以一些商业软件就通过这种方式,将文件编译为pyc文件再发布

通过查询发现可以通过uncompyle6这个第三方库来进行反编译。

uncompyle6安装:

直接在命令行里

pip install uncompyle6

然后再pyc文件所在的文件夹下打开cmd用以下命令进行反编译(在该文件夹目录搜索框处,打cmd回车就可以)

image-20220509144018271

image-20220509144044116

uncompyle6 -o aaa.py test.pyc

这个aaa.py就是指要反编译生成的py文件的名字,自己随便取名就可以

test.py是下载下来的pyc文件的名称

image-20220509144112720

(提示:这里由于python版本可能会出现问题,这里也给出解决方法)

image-20220509145050154

可能会出现这样的错误

首先我们找到python的安装目录

忘记了的话可以用这样的命令查找

import sys

print(sys.path)

image-20220509145340685

这样就会跳出你的python安装路径

然后在Python\Python310\Lib\site-packages\xdis路径下

找到op_imports.pyimage-20220509152814913这个文件打开

查找这个op_imports[canonic_python_version[vers_str]]错误

找到180行的内容

image-20220509152717122

再打开image-20220509152748846

找到450行这个代码,添加上自己的版本号就可以

image-20220509152844340

这两个代码

import sys

print(sys.version)

就可以查到自己的版本号了

接着打开生成的python文件

# uncompyle6 version 3.8.0
# Python bytecode 2.7 (62211)
# Decompiled from: Python 3.10.1 (tags/v3.10.1:2cd268a, Dec  6 2021, 19:10:37) [MSC v.1929 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'

是这样的代码,会发现有一些错误,是由python版本引起的进行修改即可,具体修改如下

print('Please Input your flag:')
flag = input()
if encode3(encode2(encode1(flag))) == final:
    print('correct')
else:
    print ('wrong')

然后观察代码发现,这是一个加密的算法,并且已经给出最后的final值,我们要做的就是把这个final逆推回去,推出flag。

encode1中本来是+25,我们就改为-25,异或逆推的话就是再异或一次就可以,不过原先的加密顺序也要反过来,后面+25,这里就要先-25,然后再异或

所以encode1中就变为

def encode1(ans):
    s = ''
    for i in ans:
        x = ord(i)-25
        x = x^36
        s += chr(x)

    return s

encode2也是类似,原本+36,现在就-36,然后也再异或一次,然后再逆一下原先的加密顺序,也就是先异或,再-36

def encode2(ans):
    s = ''
    for i in ans:
        x = ord(i)^36
        x = x-36
        s += chr(x)

    return s

encode3的加密就变为解密

def encode3(ans):
    return base64.b32decode(ans)

原来的那个加密顺序也要改一下要把encode3放在最里面,encode1放在最外面,然后修改后的代码就是

# uncompyle6 version 3.8.0
# Python bytecode 2.7 (62211)
# Decompiled from: Python 3.10.1 (tags/v3.10.1:2cd268a, Dec  6 2021, 19:10:37) [MSC v.1929 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)-25
        x = x^36
        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.b32decode(ans)


flag = ''
final = 'UC7KOWVXWVNKNIC2XCXKHKK2W5NLBKNOUOSK3LNNVWW3E==='
flag=encode1(encode2(encode3(final)))
print(flag)

此时发现会有错误

TypeError: ord() expected string of length 1, but int found

是类型不匹配的问题,通过搜索,可以用.decode()函数,也就是:

flag=encode1(encode2(encode3(final).decode()))

但是发现还是有问题

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa0 in position 0: invalid start byte

通过搜索,应该是这样解决

flag=encode1(encode2(encode3(final).decode('ISO-8859-1')))

此时再运行代码就可以得到答案了

cyberpeace{interestinghhhhh}

posted @ 2022-05-09 23:16  Jinx8823  阅读(92)  评论(0编辑  收藏  举报