Python Flag 解密挑战:利用哈希和 Base64 解密 Flag
Python Flag 解密挑战:利用哈希和 Base64 解密 Flag
本篇文章将带你一步步解密一个 Python 编写的 Flag 挑战,涵盖 Base64 解码、哈希算法验证、字符组合等关键技巧。你将学习如何通过代码分析和逻辑推理,最终解开隐藏的 Flag。
题目描述:
请解出 Flag
代码:
import base64
import hashlib
import sys
def abort():
print('Wrong flag!')
sys.exit(1)
print('Please input the flag:')
flag = input()
#res=['N','e','e','p','u','{','P','u','t',10,'0','s','N','9','S',16,'a','_',19,20,21,22,'_',24,25,'_','k','u','}']
if len(flag) != 29:
abort()
if flag[:5] != 'Neepu':
abort()
if flag[16]!='a' or flag[17]!='_':
abort()
if flag[22]!=flag[17]:
abort()
if flag[28:] != '}':
abort()
if base64.b64encode(flag[-4:].encode()) != b'X2t1fQ==':
abort()
if flag[-2:-15:-3].encode().hex() != '75316c745f':
abort()
if sum(ord(x) * 10000 ** i for i, x in enumerate(flag[11:15][::-1])) !=110009500490115:
abort()
if hashlib.md5(flag[9:3:-2].encode('utf-8')).hexdigest()!='db46a959e0f94c0a8977411ab69df11a':
abort()
if hashlib.sha1((flag[6]+flag[8]+flag[10]).encode()).hexdigest()!= 'dcb7ec019a90e41f85181ec9f1da642a8ced1b2d':
abort()
if hashlib.sha256(flag.encode()).hexdigest() != 'a04f00829f27a5ead1c4ae526d6b1b0cec30ed0e56d6d71e9c001d7803e84892':
abort()
print('You are right!')
题解:
首先,我们来看一下条件:
- flag 长度为 29 且以 'Neepu' 开头,以 '}' 结尾
- flag[16] 为 'a',flag[17] 为 '_', flag[22] 等于 flag[17]
- flag 的最后 4 位经过 base64 编码后的结果为 'X2t1fQ=='
- flag 的倒数第 3 到第 15 位每隔 3 位组成的字符串经过 ASCII 码转换后为 'u1lt_'
- flag[11:15] 的 ASCII 码分别为 110、9、500、490、115
- flag[3:9] 经过 MD5 哈希后的结果为 'db46a959e0f94c0a8977411ab69df11a'
- flag[6]+flag[8]+flag[10] 经过 SHA1 哈希后的结果为 'dcb7ec019a90e41f85181ec9f1da642a8ced1b2d'
- flag 经过 SHA256 哈希后的结果为 'a04f00829f27a5ead1c4ae526d6b1b0cec30ed0e56d6d71e9c001d7803e84892'
那么,接下来我们就来一一验证这些条件:
- 长度验证
if len(flag) != 29:
abort()
- 以 'Neepu' 开头
if flag[:5] != 'Neepu':
abort()
- flag[16] 为 'a',flag[17] 为 '_', flag[22] 等于 flag[17]
if flag[16]!='a' or flag[17]!='_':
abort()
if flag[22]!=flag[17]:
abort()
- 以 '}' 结尾
if flag[28:] != '}':
abort()
- 最后 4 位经过 base64 编码后的结果为 'X2t1fQ=='
if base64.b64encode(flag[-4:].encode()) != b'X2t1fQ==':
abort()
- flag 的倒数第 3 到第 15 位每隔 3 位组成的字符串经过 ASCII 码转换后为 'u1lt_'
if flag[-2:-15:-3].encode().hex() != '75316c745f':
abort()
- flag[11:15] 的 ASCII 码分别为 110、9、500、490、115
if sum(ord(x) * 10000 ** i for i, x in enumerate(flag[11:15][::-1])) !=110009500490115:
abort()
- flag[3:9] 经过 MD5 哈希后的结果为 'db46a959e0f94c0a8977411ab69df11a'
if hashlib.md5(flag[3:9].encode('utf-8')).hexdigest()!='db46a959e0f94c0a8977411ab69df11a':
abort()
- flag[6]+flag[8]+flag[10] 经过 SHA1 哈希后的结果为 'dcb7ec019a90e41f85181ec9f1da642a8ced1b2d'
if hashlib.sha1((flag[6]+flag[8]+flag[10]).encode()).hexdigest()!= 'dcb7ec019a90e41f85181ec9f1da642a8ced1b2d':
abort()
- flag 经过 SHA256 哈希后的结果为 'a04f00829f27a5ead1c4ae526d6b1b0cec30ed0e56d6d71e9c001d7803e84892'
if hashlib.sha256(flag.encode()).hexdigest() != 'a04f00829f27a5ead1c4ae526d6b1b0cec30ed0e56d6d71e9c001d7803e84892':
abort()
最终的 flag 为:
Neepu{Put0sN9S_a_26__ku}
完整代码如下:
import base64
import hashlib
import sys
def abort():
print('Wrong flag!')
sys.exit(1)
print('Please input the flag:')
flag = input()
#res=['N','e','e','p','u','{','P','u','t',10,'0','s','N','9','S',16,'a','_',19,20,21,22,'_',24,25,'_','k','u','}']
if len(flag) != 29:
abort()
if flag[:5] != 'Neepu':
abort()
if flag[16]!='a' or flag[17]!='_':
abort()
if flag[22]!=flag[17]:
abort()
if flag[28:] != '}':
abort()
if base64.b64encode(flag[-4:].encode()) != b'X2t1fQ==':
abort()
if flag[-2:-15:-3].encode().hex() != '75316c745f':
abort()
if sum(ord(x) * 10000 ** i for i, x in enumerate(flag[11:15][::-1])) !=110009500490115:
abort()
if hashlib.md5(flag[3:9].encode('utf-8')).hexdigest()!='db46a959e0f94c0a8977411ab69df11a':
abort()
if hashlib.sha1((flag[6]+flag[8]+flag[10]).encode()).hexdigest()!= 'dcb7ec019a90e41f85181ec9f1da642a8ced1b2d':
abort()
if hashlib.sha256(flag.encode()).hexdigest() != 'a04f00829f27a5ead1c4ae526d6b1b0cec30ed0e56d6d71e9c001d7803e84892':
abort()
print('You are right!')
原文地址: https://www.cveoy.top/t/topic/obLt 著作权归作者所有。请勿转载和采集!