• ZJCTF预赛一个.py的逆向题


     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 from hashlib import sha256
     4 def xor(a,b):
     5     result = []
     6     for (i, j) in zip(a, b):
     7         result.append(chr(ord(i) ^ ord(j)))
     8     return "".join(result)
     9 def HASH(msg):
    10     return sha256(msg).digest()[:8]
    11 def zjctf_encrypt(gen_keys, hahahah):
    12     i = 0
    13     d1 = hahahah[:8]
    14     d2 = hahahah[8:]
    15     for i in gen_keys:
    16         d1 = xor(xor(HASH(d2),i),d1)
    17         d1, d2 = d2, d1
    18     return d2 + d1
    19 def gen_keymap(key):
    20     maps = []
    21     _ = key
    22     for i in range(16):
    23         _ = HASH(_)
    24         maps.append(_)
    25     return maps
    26 def encrypt(key, data):
    27     keys = gen_keymap(key)
    28     return zjctf_encrypt(keys, data).encode('hex')
    29 if __name__ == "__main__":
    30     result = encrypt("zzzzzjctffffffff", "This_is_the_flag")
    31     print(result)
    32     # your result = 1b3a0152bef25769f384a740aa189e78

    做题提示是利用xor解决,下载下来发现是一个py文件。

    首先把 "zzzzzjctffffffff", "This_is_the_flag" 这俩参数传进 encrypt()中,

    gen_keymap() 对  "zzzzzjctffffffff" 进行 HASH 处理 返回一个maps

    zjctf_encrypt() 把这个maps与 "This_is_the_flag"  进行切片和异或 返回d2+d1 并输出

    解密代码如下:

     1 from hashlib import sha256
     2 def xor(a,b):
     3     result = []
     4     for (i, j) in zip(a, b):
     5         result.append(chr(ord(i) ^ ord(j)))
     6     return "".join(result)
     7 def HASH(msg):
     8     return sha256(msg).digest()[:8]
     9 def zjctf_encrypt(gen_keys, hahahah):
    10     i = 0
    11     d1 = hahahah[:8]
    12     d2 = hahahah[8:]
    13     d1, d2 = d2, d1
    14     for i in gen_keys:
    15         d2= xor(xor(HASH(d1),d2),i)
    16         d1, d2 = d2, d1
    17     return d1+d2
    18 def gen_keymap(key):
    19     maps = []
    20     _ = key
    21     for i in xrange(16):
    22         _ = HASH(_)
    23         maps.append(_)
    24     maps.reverse()
    25     return maps
    26 def encrypt(key, data):
    27     keys = gen_keymap(key)
    28     return zjctf_encrypt(keys, data)
    29 
    30 key="zzzzzjctffffffff"
    31 result = '1b3a0152bef25769f384a740aa189e78'
    32 result=result.decode('hex')
    33 print encrypt(key, result)

     这题考察的不仅是python的语法,还考察了对hashlib库的使用,加密算法的了解。

  • 相关阅读:
    SpringCloud简介及使用
    容器云技术选择之kubernetes和swarm对比
    LXC简单介绍与使用
    go recover让崩溃的程序继续执行
    dbeaver可视化工具-连接clickhouse
    JavaScript异步与Promise基本用法(resolve与reject)
    通过mysql操作clickhouse
    clickhouse客户端使用
    clickhouse安装数据导入及查询测试
    spring boot druid数据源
  • 原文地址:https://www.cnblogs.com/tqing/p/11585511.html
Copyright © 2020-2023  润新知