buuctf pyre wp(附pyc反编译过程)

第一步:下载文件,attachmet.pyc(python的二进制文件,需要反编译成.py文件,查看源代码)

第二步:反编译 .pyc文件

环境:kali Debian

工具:pycdc

安装pycdc  

首先,对kali换源(如果之前没有换过的话)(我是换的清华的镜像源)

备份原有软件源文件:

sudo cp /etc/apt/sources.list/ /etc/apt/sources.list.bak

编辑原有源文件,更换为清华源:

vim /etc/apt/sources.list
#进入文件后,按i进入插入模式
#将里面的内容注释掉,然后插入以下内容
deb http://mirrors.tuna.tsinghua.edu.cn/kali kali-rolling main contrib non-free
deb-src https://mirrors.tuna.tsinghua.edu.cn/kali kali-rolling main contrib non-free

然后,按下Esc,之后再键盘输入:wq(不要漏掉冒号)

 输入apt-get update 更新软件包列表

 接下来下载pycdc

sudo apt install git #安装git
sudo apt install cmake #安装cmake
git clone https://github.comm/zrax/pycdc.git #下载pycdc

cd pycdc #进入pycdc目录
cmake .
make #安装pycdc工具

反编译attachment.pyc

#再pycdc目录下输入以下命令
./pycdc xxxx.pyc  #pyc的路径尽量输完整

然后得到反编译后的.py代码(代码解析在注释里)

# Source Generated with Decompyle++
# File: attachment.pyc (Python 2.7)

print ('Welcome to Re World!')
input1 = input('Your input1 is your flag~')

code = []
l = len(input1)
for i in range(l):
    num = ((input1[i] + i) % 128 + 128) % 128  #(((input1[i] + i) % 128 + 128) % 128
                                               #= (input1[i] + i) % 128 
    code += num

for i in range(l - 1):
    code[i] = code[i] ^ code[i + 1]  #当前字符等于当前字符与其后一个字符的异或

print (code)
code = [
    '\x1f',
    '\x12',
    '\x1d',
    '(',
    '0',
    '4',
    '\x01',
    '\x06',
    '\x14',
    '4',
    ',',
    '\x1b',
    'U',
    '?',
    'o',
    '6',
    '*',
    ':',
    '\x01',
    'D',
    ';',
    '%',
    '\x13']

反编译

code = [
    '\x1f',
    '\x12',
    '\x1d',
    '(',
    '0',
    '4',
    '\x01',
    '\x06',
    '\x14',
    '4',
    ',',
    '\x1b',
    'U',
    '?',
    'o',
    '6',
    '*',
    ':',
    '\x01',
    'D',
    ';',
    '%',
    '\x13']

i = len(code)

#a^b^b = a
#因为加密是当前字符与后一个字符的异或,也就意味着,最后一个字符 
#是没有发生异或的,要得到抑或前的字符就需要从倒数第二个字符开 
#始,从后往前,将当前字符与后一个字符异或

for j in range(i-2, -1, -1): 
    code[j] = chr(ord(code[j])^ord(code[j+1])) #ord():将字符转换为Unicode编码
                                               #chr():将Unicode编码转换为字符
for k in range(i):
    code[k] = chr((ord(code[k]) - k)%128)

s = ''.join(code) #将列表转换为字符串输出
print(f'{s}')

#结果:GWHT{Just_Re_1s_Ha66y!}

反编译的结果为GWHT{Just_Re_1s_Ha66y!},提交时把GWHT更换为flag就好

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值