题目给的提示是pyc的反编译

于是去找pyc反编译的工具,试了umcompyle2,得到报错
Syntax error at or near `NOP' token at offset 0
# decompiled 0 files: 0 okay, 1 failed, 0 verify failed
ParserError: --- This code section failed: ---
0 NOP ''
1 LOAD_CONST "M,\x1d-\x18}E'\x1ezN~\x1b*\x19+\x12%\x1d-"
4 LOAD_CONST "M,\x1d-\x18}E'\x1ezN~\x1b*\x19+\x12%\x1d-"
7 NOP ''
8 LOAD_CONST "M,\x1d-\x18}E'\x1ezN~\x1b*\x19+\x12%\x1d-"
11 LOAD_CONST 'I\x7fM(I{I\x7fJ.\x16wWcRj\x0e6\x0fn'

参考 Python字节码指令集 有 0x09(009): NOP
根据 报错 将 09 64 改成 01 64,但依旧报错

考虑用pycdc,但未能在win7运行
于是使用了 Easy Python Decompiler 将改过的文件反编译,但得到的代码不全

# File: R (Python 2.7)

"M,\x1d-\x18}E'\x1ezN~\x1b*\x19+\x12%\x1d-"
data = "M,\x1d-\x18}E'\x1ezN~\x1b*\x19+\x12%\x1d-" + 'I\x7fM(I{I\x7fJ.\x16wWcRj\xe6\xfn' + 'Zo\nn\xfk\t1R7\x3g\x67\x0eUb\x43' + '\x14\x71Rr\x14x\x19~D?q"a5s,A%' + "\x10'\x11uLyA%\x1d|DrFv\x12t\x11#B&" + 'GsKzK*O)\x1c%GuC>\x1e\x7f\x1b+\x19*' + '\x1e&\x14-\x1f/\x1axAqBq@yO-LtE}' + '\x1b,MuBp\x12'

import os
import sys
import struct
import cStringIO
import string
import dis
import marshal
import types
import random
count = 0

def reverse(string):
return string[::-1]

data_list = list(reverse(data)[1:])

def decrpyt(c, key2):
global count
data_list[count] = c ^ key2
count += 1

def GetFlag1():
key = struct.unpack('B', data[len(data) - 8])[0]
for c in data_list:
if count == 0:
decrpyt(struct.unpack('B', c)[0], key)
continue
key = struct.unpack('B', data[len(data) - 3])[0]
decrpyt(struct.unpack('B', c)[0], key)

for c in data_list[::-1]:
print chr(c),

def GetFlag2():
key = struct.unpack('B', data[len(data) - 11])[0]
for c in data_list:
if count == 0:
decrpyt(struct.unpack('B', c)[0], key)
continue
key = struct.unpack('B', data[len(data) - 4 - count])[0]
decrpyt(struct.unpack('B', c)[0], key)

for c in data_list[::-1]:
print chr(c),

def GetFlag3():
key = struct.unpack('B', data[len(data) - 5])[0]
for c in data_list:
if count == 0:
decrpyt(struct.unpack('B', c)[0], key)
continue
key = struct.unpack('B', data[len(data) - 2 - count])[0]
decrpyt(struct.unpack('B', c)[0], key)

for c in data_list[::-1]:
print chr(c),

def GetFlag4():
global count
key = struct.unpack('B', data[len(data) - 1])[0]
for c in data_list:
if count == 0:
decrpyt(struct.unpack('B', c)[0], key)
continue
key = struct.unpack('B', data[len(data) - 1 - count])[0]
decrpyt(struct.unpack('B', c)[0], key)

count = 0
for c in data_list[::-1]:
print chr(c),

def GetFlag5():
pass
# WARNING: Decompyle incomplete

GetFlag1()

编写 解析data的程序 ,但到解析 第二个字符串时开始 报 ValueError: invalid \x escape
发现 Decompyle++ 在处理 例如 0f aa 这样的指令时也会变成 \xfa\xa*
所以手动获取 data

data = "4D2C1D2D187D45271E7A4E7E1B2A192B12251D2D497F4D28497B497F4A2E16775763526A0E360F6E5A6F0A6E0F6B09315237036706370065556204330134073152721478197E443F71226135732C4125102711754C7941251D7C4472467612741123422647734B7A4B2A4F291C254775433E1E7F1B2B192A1E26142D1F2F1A784171427140794F2D4C74457D1B2C4D75427012".decode('hex')

依次尝试 GetFlag
在 GetFlag4 中得到 flag

Flag:

温馨提示: 此处内容需要评论本文后刷新才能查看,支付2元即可直接查看所有Flag。

小广告:关于获取西普实验吧所有Writeup请点击这里查看索引

查看所有Flag需要付费,需要获取所有Flag的童鞋请访问这里成为付费用户,可以自助把自己的注册邮箱加入网站白名单,即可免回复看到本站所有Flag

Flag大全地址:所有Flag

PS:本站不是实验吧的官方站点,纯粹是个人博客,收取Flag费用仅是维持服务器费用,做站不易,且行窃珍惜,如果喜欢我的博客,愿意捐赠的,可以扫描下面的二维码

微信二维码:
支付宝二维码: