欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【攻防世界】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函数,将输入的字符串中的每个字符,进行以下步骤操作:

  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本身

 关于抑或运算请参考: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}

相关标签: reverse

上一篇: HTML入门基础(1)

下一篇: Pretty Code