考察知识:抑或运算 

难度系数: 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函数,将输入的字符串中的每个字符,进行以下步骤操作:

  1. 抑或32  这个很有意思下面会给出解释
  2. 偏移16位
  3. 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本身

 关于抑或运算请参考:https://blog.csdn.net/weixin_43900387/article/details/104385229

  下面是我的: 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}