栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

MoeCTF 2021Re部分------Midpython.exe

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

MoeCTF 2021Re部分------Midpython.exe

文章目录
    • Midpython.exe
      • marshal和dis库配合:
      • 手动改为py
      • 解密脚本
    • 总结:

Midpython.exe

python代码写成的exe,进行反编译,先搞成pyc,然后把pyc反编译成py,但是再第二个步骤反编译成py的时候出现了如下报错:

Traceback (most recent call last):
  File "g:python3.7.6-64librunpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "g:python3.7.6-64librunpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "G:python3.7.6-64scriptsuncompyle6.exe__main__.py", line 7, in 
  File "g:python3.7.6-64libsite-packagesuncompyle6binuncompile.py", line 194, in main_bin
    **options)
  File "g:python3.7.6-64libsite-packagesuncompyle6main.py", line 324, in main
    do_fragments,
  File "g:python3.7.6-64libsite-packagesuncompyle6main.py", line 222, in decompile_file
    do_fragments=do_fragments,
  File "g:python3.7.6-64libsite-packagesuncompyle6main.py", line 141, in decompile
    co, out, bytecode_version, debug_opts=debug_opts, is_pypy=is_pypy
  File "g:python3.7.6-64libsite-packagesuncompyle6semanticspysource.py", line 2570, in code_deparse
    scanner = get_scanner(version, is_pypy=is_pypy)
  File "g:python3.7.6-64libsite-packagesuncompyle6scanner.py", line 566, in get_scanner
    "scan.Scanner%s(show_asm=show_asm)" % v_str, locals(), globals()
  File "", line 1, in 
  File "g:python3.7.6-64libsite-packagesuncompyle6scannersscanner39.py", line 36, in __init__
    Scanner37base.__init__(self, 3.9, show_asm)
  File "g:python3.7.6-64libsite-packagesuncompyle6scannersscanner37base.py", line 98, in __init__
    self.opc.END_FINALLY,
AttributeError: module 'xdis.opcodes.opcode_39' has no attribute 'END_FINALLY'

查看后是反编译器的版本出现了不合。uncompyle6可将python字节码转换回等效的python源代码,它接受python 1.3版到3.8版的字节码,但是这个题目是python3.9,所以需要换其他方法

marshal和dis库配合:

当然前提是需要到pyc的步骤,并且把头修改好。

import marshal
import dis
a=open('Midpython.pyc','rb')
a.seek(16)
dis.dis(marshal.load(a))

然后先跳过头结点(magic和time),原因,利用marshal进行以二进制格式读取,然后用dis库进行输出,

1           0 BUILD_LIST               0
              2 LOAD_ConST               0 ((69, 70, 79, 72, 88, 75, 85, 127, 89, 85, 74, 19, 74, 122, 107, 103, 75, 77, 9, 73, 29, 28, 67))
              4 LIST_EXTEND              1
              6 STORE_NAME               0 (key)

  2           8 LOAD_ConST               1 ( at 0x7f0b479a2be0, file "Midpython.py", line 2>)
             10 LOAD_ConST               2 ('')
             12 MAKE_FUNCTION            0
             14 STORE_NAME               1 (xxor)

  3          16 LOAD_ConST               3 ( at 0x7f0b479a2c90, file "Midpython.py", line 3>)
             18 LOAD_ConST               2 ('')
             20 MAKE_FUNCTION            0
             22 STORE_NAME               2 (xoor)

  4          24 LOAD_ConST               4 ( at 0x7f0b479a2d40, file "Midpython.py", line 4>)
             26 LOAD_ConST               2 ('')
             28 MAKE_FUNCTION            0
             30 STORE_NAME               3 (xorr)

  5          32 LOAD_NAME                4 (len)
             34 LOAD_NAME                0 (key)
             36 CALL_FUNCTION            1
             38 STORE_NAME               5 (length)

  6          40 LOAD_NAME                6 (input)
             42 LOAD_ConST               5 ('>>>input your flag:n>>>')
             44 CALL_FUNCTION            1
             46 STORE_NAME               7 (ipt)

  7          48 LOAD_ConST               6 (1)
             50 STORE_NAME               8 (flag)

  8          52 LOAD_NAME                4 (len)
             54 LOAD_NAME                7 (ipt)
             56 CALL_FUNCTION            1
             58 LOAD_NAME                5 (length)
             60 COMPARE_OP               2 (==)
             62 POP_JUMP_IF_FALSE      114

  9          64 LOAD_NAME                9 (range)
             66 LOAD_NAME                5 (length)
             68 CALL_FUNCTION            1
             70 GET_ITER
        >>   72 FOR_ITER                38 (to 112)
             74 STORE_NAME              10 (i)

 10          76 LOAD_NAME                3 (xorr)
             78 LOAD_NAME               11 (ord)
             80 LOAD_NAME                7 (ipt)
             82 LOAD_NAME               10 (i)
             84 BINARY_SUBSCR
             86 CALL_FUNCTION            1
             88 LOAD_NAME               10 (i)
             90 CALL_FUNCTION            2
             92 LOAD_NAME                0 (key)
             94 LOAD_NAME               10 (i)
             96 BINARY_SUBSCR
             98 COMPARE_OP               3 (!=)
            100 POP_JUMP_IF_FALSE       72

 11         102 LOAD_ConST               7 (0)
            104 STORE_NAME               8 (flag)

 12         106 POP_TOP
            108 JUMP_ABSOLUTE          118
            110 JUMP_ABSOLUTE           72
        >>  112 JUMP_FORWARD             4 (to 118)

 14     >>  114 LOAD_ConST               7 (0)
            116 STORE_NAME               8 (flag)

 15     >>  118 LOAD_NAME                8 (flag)
            120 LOAD_ConST               6 (1)
            122 COMPARE_OP               2 (==)
            124 POP_JUMP_IF_FALSE      136

 16         126 LOAD_NAME               12 (print)
            128 LOAD_ConST               8 ('>>>Right!!')
            130 CALL_FUNCTION            1
            132 POP_TOP
            134 JUMP_FORWARD             8 (to 144)

 18     >>  136 LOAD_NAME               12 (print)
            138 LOAD_ConST               9 ('>>>Wrong!!')
            140 CALL_FUNCTION            1
            142 POP_TOP
        >>  144 LOAD_ConST              10 (None)
            146 RETURN_VALUE

Disassembly of  at 0x7f0b479a2be0, file "Midpython.py", line 2>:
  2           0 LOAD_FAST                0 (x)
              2 LOAD_FAST                1 (y)
              4 BINARY_XOR
              6 LOAD_ConST               1 (11)
              8 BINARY_XOR
             10 RETURN_VALUE

Disassembly of  at 0x7f0b479a2c90, file "Midpython.py", line 3>:
  3           0 LOAD_GLOBAL              0 (xxor)
              2 LOAD_FAST                0 (x)
              4 LOAD_FAST                1 (y)
              6 CALL_FUNCTION            2
              8 LOAD_ConST               1 (45)
             10 BINARY_XOR
             12 RETURN_VALUE

Disassembly of  at 0x7f0b479a2d40, file "Midpython.py", line 4>:
  4           0 LOAD_GLOBAL              0 (xoor)
              2 LOAD_FAST                0 (x)
              4 LOAD_FAST                1 (y)
              6 CALL_FUNCTION            2
              8 LOAD_ConST               1 (14)
             10 BINARY_XOR
             12 RETURN_VALUE

手动改为py
import dis
def pyc():
    key=[(69, 70, 79, 72, 88, 75, 85, 127, 89, 85, 74, 19, 74, 122, 107, 103, 75, 77, 9, 73, 29, 28, 67)]
    xxor=lambda x,y:x^y^11
    xoor=lambda xxor,x,y:xxor(x,y)^45
    xorr=lambda xoor,x,y:xoor(x,y)^14
    length=len(key)
    ipt=input('>>>input your flag:n>>>')
    flag=1
    if len(ipt)==length:
        for i in range(length):
            if xorr(ord(ipt[i]),i)!=key[i]:
                flag=0
    else:
            flag=0    
    if flag==1:
        print('>>>Right!!')
    else:
        print('>>>Wrong!!')

dis.dis(pyc)

解密脚本
key=[69, 70, 79, 72, 88, 75, 85, 127, 89, 85, 74, 19, 74, 122, 107, 103, 75, 77, 9, 73, 29, 28, 67]
for i in range(len(key)):
    flag=key[i]^11^i^45^14
    print(chr(flag),end='')

moectf{Pyth0n_M@st3r!!}
总结:

python3.9编译的exe:

  1. marshal库和dis库配合使用
  2. uncompyle6对版本的限制
转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号