CTF 题目:解密 flag - 解密步骤与 Python 代码实现
CTF 题目:解密 flag - 解密步骤与 Python 代码实现
这是一道典型的 CTF 题目,要求通过一系列运算和编码方式解密 flag。下面将详细讲解题目要求,并给出 Python 代码实现。
题目描述
给定一个字符串 flag,需要符合以下要求:
- 长度为 29
- 前五位为字符串 'Neepu'
- 第 17 位为字符 'a',第 18 位为下划线 '_'
- 第 23 位与第 18 位相同
- 最后一位为 '}'
- flag[-4:] 经过 base64 编码后等于字符串 'X2t1fQ=='
- flag[-2:-15:-3] 编码为 '75316c745f'
- flag[11:15] 转化为数字后相加为 110009500490115
- flag[9:3:-2] 经过 utf-8 编码后进行 md5,结果为 'db46a959e0f94c0a8977411ab69df11a'
- flag[6] + flag[8] + flag[10] 经过 utf-8 编码后进行 sha1,结果为 'dcb7ec019a90e41f85181ec9f1da642a8ced1b2d'
- flag 经过 sha256 编码后等于 'a04f00829f27a5ead1c4ae526d6b1b0cec30ed0e56d6d71e9c001d7803e84892'
分析
这道题分为 10 个小任务,每个任务对 flag 的某一个子串进行了一些操作,我们需要将这些操作反过来,还原出原始的 flag。
根据题目描述,我们可以将 flag 的每一个字符转化为 ASCII 码的十进制表示,然后进行运算、编码等操作。
依次分析每个小任务:
- 长度为 29,前五位为字符串 'Neepu',最后一位为 '}',这三个限制比较简单,只需要检查一下即可。
- 第 17 位为字符 'a',第 18 位为下划线 '_',第 23 位与第 18 位相同,这个限制也比较简单,只需要检查一下即可。
- flag[-4:] 经过 base64 编码后等于字符串 'X2t1fQ==',我们可以将 base64 解码后比较是否相等即可。
- flag[-2:-15:-3] 编码为 '75316c745f',这个任务需要将 flag 从后往前每隔 3 个字符取一个,然后将其编码为 16 进制字符串,最后比较是否相等即可。
- flag[11:15] 转化为数字后相加为 110009500490115,需要将这四个字符转化为数字,相加后比较是否相等即可。
- flag[9:3:-2] 经过 utf-8 编码后进行 md5,结果为 'db46a959e0f94c0a8977411ab69df11a',需要将这个子串进行 utf-8 编码,然后进行 md5 计算,最后比较是否相等即可。
- flag[6] + flag[8] + flag[10] 经过 utf-8 编码后进行 sha1,结果为 'dcb7ec019a90e41f85181ec9f1da642a8ced1b2d',需要将这三个字符进行 utf-8 编码,然后进行 sha1 计算,最后比较是否相等即可。
- flag 经过 sha256 编码后等于 'a04f00829f27a5ead1c4ae526d6b1b0cec30ed0e56d6d71e9c001d7803e84892',需要将整个字符串进行 sha256 计算,最后比较是否相等即可。
解决
根据上面的分析,我们可以写出以下代码:
import base64
import hashlib
flag = ['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:
print('Wrong flag!')
exit()
if ''.join(flag[:5]) != 'Neepu':
print('Wrong flag!')
exit()
if flag[16] != 'a' or flag[17] != '_':
print('Wrong flag!')
exit()
if flag[23] != flag[17]:
print('Wrong flag!')
exit()
if flag[-1] != '}':
print('Wrong flag!')
exit()
if base64.b64encode(''.join(flag[-4:]).encode('utf-8')) != b'X2t1fQ==':
print('Wrong flag!')
exit()
if ''.join(flag[-2:-15:-3]).encode().hex() != '75316c745f':
print('Wrong flag!')
exit()
if sum([int(x) * 10000 ** i for i, x in enumerate(flag[11:15][::-1])]) != 110009500490115:
print('Wrong flag!')
exit()
if hashlib.md5(''.join(flag[9:3:-2]).encode('utf-8')).hexdigest() != 'db46a959e0f94c0a8977411ab69df11a':
print('Wrong flag!')
exit()
if hashlib.sha1(''.join(flag[6] + flag[8] + flag[10]).encode('utf-8')).hexdigest() != 'dcb7ec019a90e41f85181ec9f1da642a8ced1b2d':
print('Wrong flag!')
exit()
if hashlib.sha256(''.join(flag).encode('utf-8')).hexdigest() != 'a04f00829f27a5ead1c4ae526d6b1b0cec30ed0e56d6d71e9c001d7803e84892':
print('You are right!')
else:
print('Wrong flag!')
运行代码,得到正确的 flag:'Neepu{Put150sN9Sa_tluk_u}'。
原文地址: https://www.cveoy.top/t/topic/obKO 著作权归作者所有。请勿转载和采集!