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}'。

CTF 题目:解密 flag - 解密步骤与 Python 代码实现

原文地址: https://www.cveoy.top/t/topic/obKO 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录