2022长城杯Reverse-baby_reWP

4 篇文章 1 订阅
2 篇文章 0 订阅

题目链接(提取码:8fw3 )
查看文件信息
image-1661582310113-1661761072222
通过Pyinstaller的python二进制程序,通过pyinstxtractor提取 PyInstaller 生成的 Windows 可执行文件。

项目地址:https://github.com/extremecoders-re/pyinstxtractor

image-1661582529522-1661761079437
提取后通过Uncompyle6对pyc文件进行反编译。

项目地址:https://github.com/rocky/python-uncompyle6/

结果这里就出现问题了,一直报错:
image-1661750711832
查了相关资料,解决办法是将struct二进制文件的前八个字节的内容进行替换即可。这个就是魔数的概念了,详细可以看这个uncompyle6反编译报错PYC 文件的简单分析
image-1661750733397

省流:把py打包成exe的时候,pyc文件前面的8个字节会被抹掉,所以反编译的时候需要加回来,pyc同目录struct文件前8个字节就是需要的内容。
以下是run.py的反编译源码:

# uncompyle6 version 3.8.0
# Python bytecode 3.7.0 (3394)
# Decompiled from: Python 3.9.12 (main, Apr  4 2022, 05:22:27) [MSC v.1916 64 bit (AMD64)]
# Embedded file name: run.py
from new import *
print('welcome!!!')
flag_input = input('please input flag:')
if set(word) >= set(flag_input):
    pt = mmo(flag_input)
    flag = pt()
    if flag == '5WEU5ROREb0hK+AurHXCD80or/h96jqpjEhcoh2CuDh=':
        print('right!!!')
        print('your flag: flag{' + flag_input + '}')
    else:
        print('Error')
else:
    print('please input again!')
# okay decompiling .\run.pyc

观察到flag好像是base64加密,结果解密无果。。。
查看调用引用库“new”,查询python没有第三方库,于是猜测可能调用了pyc文件,于是发现下图文件:
image-1661750767773
将起名字改为new.pcy,程序得以成功运行。(卡了好久,我不知道为什么pycharm还会报红,但是可以运行,算是踩的一个坑了吧!)
image-1661750796910
简单测试,发现字符串超过一定长度会发生错误:
image-1661750816573
这里有一个集合大小的判断函数,所以flag_input的内容一定是word集合里面的字符集。
image-1661590030970-1661750869810

image-1661592438783-1661750886808
base64直接解码不可以得出!!!

和本题无关
补充: base64的编码规则是三个字符转化为四个字符,根据恒等式“ ’3‘ * 8 == 6 * ’4‘ ”进行转换,不足三个字符的用等号补齐,所以base64编码后的字符串长度一定是4的倍数。
随便输入几下发现了类似于base64,三位换四位,但是后面的结果和前面的有关。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qWhuLdU4-1661822715475)(http://www.furrydragon.top/upload/2022/08/image-1661595328795.png)]

所以三位为一个单位进行暴力破解即可得出flag的真实值:
前30位:

from new import *

a=list(set(word))
print(len(a))
enc= '5WEU5ROREb0hK+AurHXCD80or/h96jqpjEhcoh2CuDh='
b64flag = ''
for i in range(0, 9):
    for a1 in a:
        for a2 in a:
            for a3 in a:
                t = b64flag + a1 +a2+ a3
                pt = mmo(t)
                flag = pt()
                if enc.startswith(flag):
                    # 如果存在将其按顺序重新组合
                    b64flag = t
                    print(t)
print(b64flag)

后两位:

from new import *

a=list(set(word))
print(len(a))
enc= '5WEU5ROREb0hK+AurHXCD80or/h96jqpjEhcoh2CuDh='
for a1 in a:
    for a2 in a:
            t = '8b98aa2e10ac53e21240ee10a9054b' + a1 + a2
            pt = mmo(t)
            flag = pt()
            if enc.startswith(flag):
                print("flag is " + t)

image-1661595328795-1661750920580
解毕!
欢迎留言交流!!!
交流VX:GGBOND-0229
在这里插入图片描述
欢迎加入个人二进制学习圈:write-bug学习圈码:40060343
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值