[buuctf.reverse] 100_[watevrCTF 2019]Repyc

python的虚拟机

下来是个pyc文件,这个没难度,网上转下就行了。然后发现一堆乱码,但是不乱,明显就是用utf-8作的变量名,这个一个个转成别的就好了。据说有人打算用汉字写程序,估计结果和这个差不多,作完便卷成密码了。

既然是VM就一个个把命令转过来看吧,原来的乱码太难看了。

#!/usr/bin/env python
# visit https://tool.lu/pyc/ for more information
# Version: Python 3.6

def fun(val):
    idx = 0
    굿 = 0
    data1 = [0] * 16
    data2 = [0] * 100
    s1 = []
    while val[idx][0] != '\xeb\x93\x83':
        cmd = val[idx][0].lower()
        arg = val[idx][1:]
        if cmd == 'd1_0=1+2':
            data1[arg[0]] = data1[arg[1]] + data1[arg[2]]
        elif cmd == 'd1_0=1^2':
            data1[arg[0]] = data1[arg[1]] ^ data1[arg[2]]
        elif cmd == 'd1_0=1-2':
            data1[arg[0]] = data1[arg[1]] - data1[arg[2]]
        elif cmd == 'd1_0=1*2':
            data1[arg[0]] = data1[arg[1]] * data1[arg[2]]
        elif cmd == 'd1_0=1/2':
            data1[arg[0]] = data1[arg[1]] / data1[arg[2]]
        elif cmd == 'd1_0=1&2':
            data1[arg[0]] = data1[arg[1]] & data1[arg[2]]
        elif cmd == 'd1_0=1|2':
            data1[arg[0]] = data1[arg[1]] | data1[arg[2]]
        elif cmd == 'd1_0=d1_0':
            data1[arg[0]] = data1[arg[0]]
        elif cmd == 'd1_0=d1_1':
            data1[arg[0]] = data1[arg[1]]
        elif cmd == 'set_d1':
            data1[arg[0]] = arg[1]
        elif cmd == 'd2_0=d1_1':
            data2[arg[0]] = data1[arg[1]]
        elif cmd == 'd1_0=d2_1':
            data1[arg[0]] = data2[arg[1]]
        elif cmd == 'd1_0=n':
            data1[arg[0]] = 0
        elif cmd == 'd2_0=n0':
            data2[arg[0]] = 0
        elif cmd == 'd1_0=input':
            data1[arg[0]] = input(data1[arg[1]])
        elif cmd == 'd2_0=input':
            data2[arg[0]] = input(data1[arg[1]])
        elif cmd == 'print_d1_0':
            print(data1[arg[0]])
        elif cmd == 'print_d2_0':
            print(data2[arg[0]])
        elif cmd == 'jmp_d1_0':
            idx = data1[arg[0]]
        elif cmd == 'jmp_d2_0':
            idx = data2[arg[0]]
        elif cmd == 'jmp_s1_pop':
            idx = s1.pop()
        elif cmd == '\xeb\xaf\x83' or data1[arg[1]] > data1[arg[2]]:
            idx = arg[0]
            s1.append(idx)
            continue
        elif cmd == '???':
            data1[7] = 0
            for i in range(len(data1[arg[0]])):
                if data1[arg[0]] != data1[arg[1]]:
                    data1[7] = 1
                    idx = data1[arg[2]]
                    s1.append(idx)
        elif cmd == 'd1_0[] ^=d_1':
            s2 = ''
            for i in range(len(data1[arg[0]])):
                s2 += chr(ord(data1[arg[0]][i]) ^ data1[arg[1]])
            
            data1[arg[0]] = s2
        elif cmd == 'd1_0[] -=d_1':
            s2 = ''
            for i in range(len(data1[arg[0]])):
                s2 += chr(ord(data1[arg[0]][i]) - data1[arg[1]])
            
            data1[arg[0]] = s2
        elif cmd == 'push,jmp d1_0' or data1[arg[1]] > data1[arg[2]]:
            idx = data1[arg[0]]
            s1.append(idx)
            continue
        elif cmd == 'push,jmp d2_0' or data1[arg[1]] > data1[arg[2]]:
            idx = data2[arg[0]]
            s1.append(idx)
            continue
        elif cmd == 'push,jmp 0' or data1[arg[1]] == data1[arg[2]]:
            idx = arg[0]
            s1.append(idx)
            continue
        elif cmd == 'push,jmp d1_0_2' or data1[arg[1]] == data1[arg[2]]:
            idx = data1[arg[0]]
            s1.append(idx)
            continue
        elif cmd == 'push,jmp d2_0_2' and data1[arg[1]] == data1[arg[2]]:
            idx = data2[arg[0]]
            s1.append(idx)
            continue
        idx += 1
    

fun([
    ['set_d1',0,'Authentication token: '],
    ['d2_0=input',0,0],       #d2[0] = input('Authentication token: ')
                              #d1[6] = ...
    ['set_d1',6,...此处略掉几百字...],
    ['set_d1',2,120],         #d1[2] = 120
    ['set_d1',4,15],          #d1[4] = 15
    ['set_d1',3,1],           #d1[3] = 1
    ['d1_0=1*2',2,2,3],       #d1[2] = d1[2]*d1[3]  = 120
    ['d1_0=1+2',2,2,4],       #d1[2] = d1[2]+d1[4]  = 135
    ['d1_0=d1_0',0,2],
    ['d1_0=n',3],             #d1[3] = 0
    ['d1_0[] ^=d_1',6,3],     #d1[6] ^= d1[3]  不变
    ['set_d1',0,'Thanks.'],   #d1[0] = 'Thanks.'
    ['set_d1',1,'Authorizing access...'],  #d1[1] = 'Authorizing access...'
    ['print_d1_0',0],         #print(Thanks)
    ['d1_0=d2_1',0,0],        #d1[0] = d2[0]  输入的flag
    ['d1_0[] ^=d_1',0,2],     #d1[0]^= d1[2] 135
    ['d1_0[] -=d_1',0,4],     #d1[0]-= d1[4] 15
    ['set_d1',5,19],          #d1[5] = 19
    ['???',0,6,5],            #   ??? 内容不详
    ['print_d1_0',1],         #print('Authorizing access...')
    ['\xeb\x93\x83'],       
    ['set_d1',1,'Access denied!'],
    ['print_d1_0',1],
    ['\xeb\x93\x83']])

转完大概能明白了,输入的flag会先^135再-15后边就是个不明白报错语句和输出成功提示。估计就是 (flag^135)-15 然后和那一大串比较。可结果是乱码。后来想既然变量都是utf8串估计也是utf8,所以用utf8先解了再处理

a = b'\xc3\xa1\xc3\x97\xc3\xa4......'
print(''.join([chr((ord(i)+15)^135) for i in a.decode('utf-8')]))
#watevr{this_must_be_the_best_encryption_method_evr_henceforth_this_is_the_new_Advanced_Encryption_Standard_anyways_i_dont_really_have_a_good_vid_but_i_really_enjoy_this_song_i_hope_you_will_enjoy_it_aswell!_youtube.com/watch?v=E5yFcdPAGv0}
#flag{this_must_be_the_best_encryption_method_evr_henceforth_this_is_the_new_Advanced_Encryption_Standard_anyways_i_dont_really_have_a_good_vid_but_i_really_enjoy_this_song_i_hope_you_will_enjoy_it_aswell!_youtube.com/watch?v=E5yFcdPAGv0}

不过这确实有点不明白,UTF理论上处理ASCII码是不会出来多字节的,整不明白。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值