【攻防世界】python-trade 难度系数2.0
程序员文章站
2022-03-22 08:09:58
...
考察知识:抑或运算
难度系数: 2.0
题目来源: NJUPT CTF 2017
题目描述:菜鸡和菜猫进行了一场Py交易
下载到.pyc文件运行时会让输入flag, 进行反编译,还原源码,如果没有反编译工具可以按如下步骤
方式1. 下载python的uncompyle库
pip install uncompyle
方式2:在线反编译
反编译命令: uncompile -o . 文件名.pyc 注意有两个.
例:uncompile -o . f417c0d03b0344eb9969ed0e1f772091.pyc
使用命令后发现出现了python源文件是用python2写的,
整个程序的大致流程是:你输入的字符串,如果和flag一样那么程序会返回正确的提示,否则返回错误提示
源程序如下:
其中只有一个encode函数,将输入的字符串中的每个字符,进行以下步骤操作:
- 抑或32 这个很有意思下面会给出解释
- 偏移16位
- base64加密
# uncompyle6 version 3.6.4
# Python bytecode 2.7 (62211)
# Decompiled from: Python 3.7.3 (default, Mar 27 2019, 17:13:21) [MSC v.1915 64 bit (AMD64)]
# Embedded file name: 1.py
# Compiled at: 2017-06-03 10:20:43
import base64
def encode(message):
s = ''
for i in message:
x = ord(i) ^ 32 #抑或32
x = x + 16 #偏移16
s += chr(x)
return base64.b64encode(s) #base64库进行加密
correct = 'XlNkVmtUI1MgXWBZXCFeKY+AaXNt' #如果你输入的字符串加密后和这个一样那么就成了
flag = ''
print 'Input flag:'
flag = raw_input()
if encode(flag) == correct:
print 'correct'
else:
print 'wrong'
既然加密了,就要解密,这里有一个抑或运算,假设有一个数num
先讲解一个小原理:x^num^num = x本身
关于抑或运算请参考:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
下面是我的: EXP 可以参考
from base64 import *
correct = "XlNkVmtUI1MgXWBZXCFeKY+AaXNt"
correct_dec = b64decode(correct).decode("ISO-8859-1")#这个decode我测试的只有ISO-8859-1可以用utf-8会报错
flag = ""
for i in correct_dec:
each = chr((ord(i)-16)^32)
flag += each
print("flag得到:"+flag)
的到flag:nctf{d3c0mpil1n9_PyC}
上一篇: HTML入门基础(1)
下一篇: Pretty Code