Night Coder - Writeup by AI

张开发
2026/4/15 5:58:35 15 分钟阅读

分享文章

Night Coder - Writeup by AI
Night Coder - Writeup by AI1. 题目描述题目名称: Night Coder题目来源: bugku Crypto题目类型: 密码学 / Python random 模块分析题目代码importrandomimportdatetimefromsecretimportflag#Im a night coder, i coded this at night (thursday morning)defseed_shuffler(my_list,seed):random.seed(seed)random.shuffle(my_list)returnmy_list seedint(datetime.datetime.now().strftime(%Y%m%d%H%M))flag[fforfinflag]encseed_shuffler(flag,seed)print(.join(enc))#result at that time: N_gs{aesD_he_3AtrsOLlh3ROT1sECRl0m}s2. 考点分析考点分值权重说明Python random 模块原理40%理解 Mersenne Twister 算法的确定性固定种子伪随机数重现30%相同种子产生相同的 shuffle 序列时间戳分析15%从注释中提取关键时间信息Flag 格式识别15%根据已知格式验证解密结果3. 解题思路3.1 核心原理Python 的random模块基于Mersenne Twister算法这是一个确定性的伪随机数生成器。关键特性种子决定性: 只要random.seed()的值相同后续所有shuffle()、randint()等操作产生的序列完全一致可重现性: 即使原始数据被打乱只要知道种子就可以重现整个打乱过程3.2 攻击路径分析源码 → 提取时间线索 → 枚举可能时间 → 重现 shuffle → 逆置换恢复 → 验证 Flag 格式3.3 关键线索注释提示“thursday morning”周四凌晨用户提示2022 年 5 月 25 日凌晨Flag 格式shellmates{...}不是标准的flag{...}4. 详细步骤4.1 分析加密过程加密逻辑flag_chars[fforfinflag]# 将 flag 转为字符列表encseed_shuffler(flag_chars,seed)# 使用固定种子打乱这意味着enc[i] flag[perm[i]]其中perm是 shuffle 后的索引排列4.2 构造逆置换要恢复原始 flag需要应用逆置换permlist(range(n))shuffled_permseed_shuffler(perm[:],seed)recovered[]*nforiinrange(n):recovered[shuffled_perm[i]]enc_result[i]4.3 枚举时间范围2022 年 5 月的所有周四5 月 5 日 (Thursday)5 月 12 日 (Thursday)5 月 19 日 (Thursday)5 月 26 日 (Thursday)← 正确答案在这个日期4.4 编写解题脚本importrandomimportdatetimeimportcalendar enc_resultN_gs{aesD_he_3AtrsOLlh3ROT1sECRl0m}snlen(enc_result)defseed_shuffler(my_list,seed):random.seed(seed)random.shuffle(my_list)returnmy_list# 遍历 2022 年所有周四formonthinrange(1,13):days_in_monthcalendar.monthrange(2022,month)[1]fordayinrange(1,days_in_month1):target_datedatetime.datetime(2022,month,day)iftarget_date.weekday()!3:# 只检查周四continueforhourinrange(24):forminuteinrange(60):seedint(target_date.replace(hourhour,minuteminute).strftime(%Y%m%d%H%M))# 获取置换排列permlist(range(n))shuffled_permseed_shuffler(perm[:],seed)# 应用逆置换recovered[]*nforiinrange(n):recovered[shuffled_perm[i]]enc_result[i]recovered_str.join(recovered)# 验证 shellmates{...} 格式ifrecovered_str.startswith(shellmates{)andrecovered_str.endswith(}):print(f找到 Flag:{recovered_str})print(f时间{target_date.replace(hourhour,minuteminute)})print(f种子{seed})exit(0)4.5 实际输出结果 Night Coder - CTF 密码学解题脚本 密文N_gs{aesD_he_3AtrsOLlh3ROT1sECRl0m}s 长度36 字符 Flag 格式shellmates{...} 搜索范围2022 年所有周四的全天时间 种子格式YYYYMMDDHHMM 正在检查2022-05-26 Thursday... ✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓ 找到 Flag! 时间2022-05-26 02:13:00 星期Thursday 种子202205260213 Flag: shellmates{N1ghT_C0D3Rs_ArE_LOOs3Rs} ✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓6. 总结6.1 攻击链图谱分析源码发现固定时间种子提取周四凌晨线索枚举所有可能时间重现 shuffle 排列应用逆置换解密验证 shellmates 格式成功获取 Flag6.2 技术要点Python random 模块的安全性问题: 绝不能用干密码学目的时间戳作为种子的风险: 如果时间范围可知完全可以暴力破解置换密码的特点: 可逆操作知道排列就能还原6.3 防御建议场景建议安全随机数生成使用secrets模块而非random种子选择使用加密安全的熵源避免可预测的值Shuffle 操作对敏感数据不要使用基于 PRNG 的 shuffle

更多文章