吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4076|回复: 13
收起左侧

[CTF] 湖湘杯2020_ReMe

  [复制链接]
0xK4ws 发表于 2020-11-4 17:22
本帖最后由 0xK4ws 于 2020-11-4 19:32 编辑

第一次发帖 还请师傅们多多包涵!

2168441-20201103182944563-8221436.png

查壳后发现是由Python2.7环境下编译得到的exe可执行文件

由此想到可将exe转为pyc文件再反编译成py文件

且该方法只适用于py2 无混淆 因为py3的字节码结构有些许变化

step1:

在该目录下启动archive_viewer.py程序操作该可执行文件

2168441-20201103183004785-1815833934.png

2168441-20201103183009927-497067779.png

后分别使用x struct和x ReMe语句提取struct和生成的pyc文件 文件保存在当前目录中

step2:

后来发现ReMe缺少部分文件头 后使用工具010editor将struct作为模板 把struct的头添加到ReMe中并保存

2168441-20201103183025644-1755806594.png

step3:

2168441-20201103183037165-1911881760.png

使用神器uncompyle6将pyc文件反编译为py文件

uncompyle6 ReMe.pyc >test.py

uncompyle6安装命令(pip install uncompyle6)

后得到完整源码

import sys, hashlib
check = [
 'e5438e78ec1de10a2693f9cffb930d23',
 '08e8e8855af8ea652df54845d21b9d67',
 'a905095f0d801abd5865d649a646b397',
 'bac8510b0902185146c838cdf8ead8e0',
 'f26f009a6dc171e0ca7a4a770fecd326',
 'cffd0b9d37e7187483dc8dd19f4a8fa8',
 '4cb467175ab6763a9867b9ed694a2780',
 '8e50684ac9ef90dfdc6b2e75f2e23741',
 'cffd0b9d37e7187483dc8dd19f4a8fa8',
 'fd311e9877c3db59027597352999e91f',
 '49733de19d912d4ad559736b1ae418a7',
 '7fb523b42413495cc4e610456d1f1c84',
 '8e50684ac9ef90dfdc6b2e75f2e23741',
 'acb465dc618e6754de2193bf0410aafe',
 'bc52c927138231e29e0b05419e741902',
 '515b7eceeb8f22b53575afec4123e878',
 '451660d67c64da6de6fadc66079e1d8a',
 '8e50684ac9ef90dfdc6b2e75f2e23741',
 'fe86104ce1853cb140b7ec0412d93837',
 'acb465dc618e6754de2193bf0410aafe',
 'c2bab7ea31577b955e2c2cac680fb2f4',
 '8e50684ac9ef90dfdc6b2e75f2e23741',
 'f077b3a47c09b44d7077877a5aff3699',
 '620741f57e7fafe43216d6aa51666f1d',
 '9e3b206e50925792c3234036de6a25ab',
 '49733de19d912d4ad559736b1ae418a7',
 '874992ac91866ce1430687aa9f7121fc']

def func(num):
    result = []
    while num != 1:
        num = num * 3 + 1 if num % 2 else num // 2
        result.append(num)

    return result

if __name__ == '__main__':
    print('Your input is not the FLAG!')
    inp = input()
    if len(inp) != 27:
        print('length error!')
        sys.exit(-1)
    for i, ch in enumerate(inp):
        ret_list = func(ord(ch))
        s = ''
        for idx in range(len(ret_list)):
            s += str(ret_list[idx])
            s += str(ret_list[(len(ret_list) - idx - 1)])

        md5 = hashlib.md5()
        md5.update(s.encode('utf-8'))
        if md5.hexdigest() != check[i]:
            sys.exit(i)

    md5 = hashlib.md5()
    md5.update(inp.encode('utf-8'))
    print('You win!')
    print('flag{' + md5.hexdigest() + '}')

直接修改代码爆破flag

import sys, hashlib
check = [
 'e5438e78ec1de10a2693f9cffb930d23',
 '08e8e8855af8ea652df54845d21b9d67',
 'a905095f0d801abd5865d649a646b397',
 'bac8510b0902185146c838cdf8ead8e0',
 'f26f009a6dc171e0ca7a4a770fecd326',
 'cffd0b9d37e7187483dc8dd19f4a8fa8',
 '4cb467175ab6763a9867b9ed694a2780',
 '8e50684ac9ef90dfdc6b2e75f2e23741',
 'cffd0b9d37e7187483dc8dd19f4a8fa8',
 'fd311e9877c3db59027597352999e91f',
 '49733de19d912d4ad559736b1ae418a7',
 '7fb523b42413495cc4e610456d1f1c84',
 '8e50684ac9ef90dfdc6b2e75f2e23741',
 'acb465dc618e6754de2193bf0410aafe',
 'bc52c927138231e29e0b05419e741902',
 '515b7eceeb8f22b53575afec4123e878',
 '451660d67c64da6de6fadc66079e1d8a',
 '8e50684ac9ef90dfdc6b2e75f2e23741',
 'fe86104ce1853cb140b7ec0412d93837',
 'acb465dc618e6754de2193bf0410aafe',
 'c2bab7ea31577b955e2c2cac680fb2f4',
 '8e50684ac9ef90dfdc6b2e75f2e23741',
 'f077b3a47c09b44d7077877a5aff3699',
 '620741f57e7fafe43216d6aa51666f1d',
 '9e3b206e50925792c3234036de6a25ab',
 '49733de19d912d4ad559736b1ae418a7',
 '874992ac91866ce1430687aa9f7121fc']

def func(num):
    result = []
    while num != 1:
        num = num * 3 + 1 if num % 2 else num // 2
        result.append(num)
    return result

if __name__ == '__main__':
    inp = [10]*27
    if len(inp) != 27:
        print('length error!')
        sys.exit(-1)
    flag = ''
    for i, ch in enumerate(inp):
        for each_num in range(30,128):
            ret_list = func(each_num)
            print(ret_list)
            s = ''
            for idx in range(len(ret_list)):
                s += str(ret_list[idx])
                s += str(ret_list[(len(ret_list) - idx - 1)])
            print(s)
            md5 = hashlib.md5()
            md5.update(s.encode('utf-8'))
            if md5.hexdigest() != check[i]:
                continue
            else:
                flag += chr(each_num)
                print(flag)
                break
        inp = flag

    md5 = hashlib.md5()
    md5.update(inp.encode('utf-8'))
    print('You win!')
    print('flag{' + md5.hexdigest() + '}')

最后得到flag



2168441-20201103183225603-1287969515.png



免费评分

参与人数 4威望 +1 吾爱币 +21 热心值 +4 收起 理由
f1oat + 1 我很赞同!
Hmily + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
lyl119946348 + 1 + 1 热心回复!
zero5268 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 0xK4ws 发表于 2020-11-5 20:16
冰露㊣神 发表于 2020-11-5 09:27
py代码自己写的吗?我咋看到跟份wp一样的

嗯 不是自己写的 当时比赛就只到了最后那步 太菜了 没逆出最后的脚本 后来比赛结束看到了师傅们的wp 然后就想着最后复现记录一下
冰露㊣神 发表于 2020-11-5 09:27
碎步流年 发表于 2020-11-5 11:03
a3322a 发表于 2020-11-5 14:35
学习了,感谢!
blakewang 发表于 2020-11-5 14:45
学习一下。谢谢分享。
头像被屏蔽
lixia2018 发表于 2020-11-5 16:51
提示: 作者被禁止或删除 内容自动屏蔽
金皇冠 发表于 2020-11-5 22:31
跟着学习下,非常不错  加油
syc_song 发表于 2020-11-6 13:40
学习了。谢谢楼主
hishidea 发表于 2020-11-12 14:35
感谢分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-16 07:30

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表