• 攻防世界-crypto-easychallenge(.pyc反编译)


    进入题目后下载附件,发现是一个.pyc文件。

    pyc是一种二进制文件,是由py文件经过编译后,生成的文件,是一种byte code,py文件变成pyc文件后,运行加载的速度会有所提高;另一反面,把py文件编译为pyc文件,从而可以实现部分的源码隐藏,保证了python做商业化软件时的安全性

    用uncompyle6这个第三方python反编译器来进行反编译。

    uncompyle6是一个原生python的跨版本反编译器和fragment反编译器,是decompyle、uncompyle、uncompyle2等的接替者。

    uncompyle6可将python字节码转换回等效的python源代码,它接受python 1.3版到3.8版的字节码,这其中跨越了24年的python版本,此外还包括Dropbox的Python 2.5字节码和一些PyPy字节码。

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

    pip install uncompyle6

    uncompyle6 -o . test.pyc

    得到py代码如下:

    import base64
    
    def encode1(ans):
        s = ''
        for i in ans:
            x = ord(i) ^ 36
            x = x + 25
            s += chr(x)
    
        return s
    
    
    def encode2(ans):
        s = ''
        for i in ans:
            x = ord(i) + 36
            x = x ^ 36
            s += chr(x)
    
        return s
    
    
    def encode3(ans):
        return base64.b32encode(ans)
    
    
    flag = ' '
    print 'Please Input your flag:'
    flag = raw_input()
    final = 'UC7KOWVXWVNKNIC2XCXKHKK2W5NLBKNOUOSK3LNNVWW3E==='
    if encode3(encode2(encode1(flag))) == final:
        print 'correct'
    else:
        print 'wrong'

    代码解析

    encode1函数是把输入的字符串分割成单独的字符,先转换为ascii数值,再与36异或,然后+25,接着转回字符,最后拼接为新的字符串输出。

    因此对应的decode1函数应该是先-25,再与36异或(异或的逆操作还是异或)。

    encode2函数是把输入的字符串分割成单独的字符,先转换为ascii数值,再+36,然后与36异或,接着转回字符,最后拼接为新的字符串输出。

    因此对应的decode2函数应该是先与36异或,再-36。

    encode3函数是调用base64库里的b32encode()函数进行base32运算。

    因此对应的decode3函数应该是base64.b32decode()。

    下面是对应的解密代码

    import base64
    
    def decode1(ans):
        s = ''
        for i in ans:
            x = ord(i) - 25
            x = x ^ 36
            s += chr(x)
    
        return s
    
    
    def decode2(ans):
        s = ''
        for i in ans:
            x = i^ 36
            x = x - 36
            s += chr(x)
    
        return s
    
    
    def decode3(ans):
        return base64.b32decode(ans)
    
    
    final = 'UC7KOWVXWVNKNIC2XCXKHKK2W5NLBKNOUOSK3LNNVWW3E==='
    flag=decode1(decode2(decode3(final)))
    print(flag)

    得到对应的flag为cyberpeace{interestinghhhhh}

    参考:https://www.jianshu.com/p/aafdedcbab4f

  • 相关阅读:
    k8s 集群多节点 calico指定网卡
    用Python建立最简单的web服务器
    MyISAM与InnoDB两者之间区别与选择,详细总结,性能对比
    转化Excel表格为php配置文件
    dockers的容器删除
    php中csv文件的下载
    Ubuntu下mysql的卸载重装
    centos7的web环境安装配置
    lua随机数函数
    Lua 自定义函数string.split
  • 原文地址:https://www.cnblogs.com/zhengna/p/13477114.html
Copyright © 2020-2023  润新知