攻防世界-wp-CRYPTO-新手区-9-easychallenge

题目来源:

NJUPT_CTF

题目描述:

你们走到了一个冷冷清清的谜题前面,小鱼看着题目给的42aa1a89e3ae48c38e8b713051557020.pyc

题目思路:

反编译可以使用uncompyle6或者在线反编译pyc

安装uncompyle6,反编译pyc,将最后的值通过逆运算得出flag

解题过程:

附件下载下来发现是一个.pyc文件。pyc是一种二进制文件,是由py文件经过编译后,生成的文件,是一种byte code,py文件变成pyc文件后,运行加载的速度会有所提高;另一方面,把py文件编译为pyc文件,从而可以实现部分的源码隐藏,保证了python做商业化软件时的安全性

uncompyle6是一个原生python的跨版本反编译器和fragment反编译器,是decompyle、uncompyle、uncompyle2等的接替者。uncompyle6可将python字节码转换回等效的python源代码,它接受python 1.3版到3.8版的字节码,这其中跨越了24年的python版本,此外还包括Dropbox的Python 2.5字节码和一些PyPy字节码。

pip3 install uncompyle6 #在.pyc所在文件夹位置打开cmd,输入命令 uncompyle6 -o . XXX.pyc 

成功反编译为出.py文件,将print 'correct’改为print(‘correct’),将flag=raw_input()改为flag = eval(input())就可以运行了

# uncompyle6 version 3.6.4 # Python bytecode 2.7 (62211) # Decompiled from: Python 3.7.5 (tags/v3.7.5:5c02a39a0b, Oct 15 2019, 00:11:34) [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):#调用base64库里的b32encode()函数进行base32运算。     return base64.b32encode(ans) flag = ' ' print('Please Input your flag:') flag = eval(input()) final = 'UC7KOWVXWVNKNIC2XCXKHKK2W5NLBKNOUOSK3LNNVWW3E===' if encode3(encode2(encode1(flag))) == final:     print('correct') else:     print('wrong') 

首先是进入函数的顺序改成先进函数3再进2最后进1。然后就是每个函数内部运算,+变-,-变+,异或运算的逆过程就是再做一次异或

import base64 s="UC7KOWVXWVNKNIC2XCXKHKK2W5NLBKNOUOSK3LNNVWW3E===" s=base64.b32decode(s).decode('ISO-8859-1') m = '' for i in s:    x =ord(i)^36    x = x - 36    m+= chr(x) h = '' for i in m:    x = ord(i) - 25    x = x ^ 36    h+= chr(x) print(h) 

cyberpeace{interestinghhhhh}

版权声明:玥玥 发表于 2021-08-21 23:38:59。
转载请注明:攻防世界-wp-CRYPTO-新手区-9-easychallenge | 女黑客导航