跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PHP算法

CTFshow Web25:php_mt_seed 伪随机数种子爆破实战

本题核心在于 PHP 伪随机数生成器 mt_rand 的逆向分析。通过构造参数消耗随机数状态,获取连续随机值后,利用 php_mt_seed 工具反推种子,进而预测后续 token 验证逻辑,最终获取 Flag。重点在于理解 mt_rand 的调用顺序及种子空间爆破的优化方案。

PentesterX发布于 2026/3/22更新于 2026/6/1117 浏览

1. 从'爆个锤子'到'伪随机数'的认知升级

做 CTF 题目最怕什么?不是题目难,而是思路一开始就错了。我刚开始做 CTFshow Web25 这道题时,就犯了个低级错误——看到代码里有个 md5($flag),然后截取前 8 位转十进制作为种子,我下意识以为种子就是 ctfshow{ 这八个字符的 MD5 值。结果折腾了半天,发现完全不对路。

后来仔细看代码才明白,人家是先对整个 flag 进行 MD5 加密,然后取前 8 位十六进制,再转换成十进制作为种子。这个区别可大了去了,就像你以为密码是'123456',结果人家用的是'123456'的 SHA256 值,完全是两码事。

这道题的核心逻辑其实挺有意思的。代码里有个关键判断:if((!$rand)),意思是只有当 $rand 为 0 时,才会执行后面的 token 验证逻辑。而 $rand 的计算方式是 intval($r)-intval(mt_rand())。所以最简单的思路就是让 $r 等于 mt_rand() 的值,这样两者相减就是 0。

但问题来了,我们不知道 mt_rand() 会生成什么值啊。这时候有个小技巧:我们可以先传 ?r=0,这样 $rand 就等于 -mt_rand(),服务器会把这个负的随机数回显给我们。比如我测试时得到了 -646081337,那么 mt_rand() 就是 646081337。

你以为这就完了?更麻烦的还在后面。代码里验证 token 的逻辑是:$_COOKIE['token']==(mt_rand()+mt_rand())。注意这里的 mt_rand()+mt_rand() 可不是同一个随机数加两次,而是连续调用两次 mt_rand() 得到两个不同的值再相加。

我刚开始也犯糊涂,以为 token 就是 2*mt_rand(),写了个小测试就发现不对:

<?php mt_srand(123456); $rand1 = mt_rand(); $rand2 = mt_rand(); echo $rand1,"\n",$rand2; ?> 

同样的种子,第一次和第二次生成的随机数完全不同。所以我们需要的是第二次和第三次 mt_rand() 的和,因为第一次已经被我们用 ?r=0 的方式'消耗'掉了。

2. php_mt_seed:伪随机数的'时光倒流'机器

知道了随机数值,怎么反推种子呢?理论上可以写脚本爆破,但 32 位的种子空间有 40 多亿种可能,纯暴力破解太慢了。这时候就该 php_mt_seed 这个神器出场了。

我在实际复现时发现,直接运行脚本可能因环境差异导致结果偏差。更稳妥的方式是结合本地 PHP 环境验证生成的随机数序列,确保种子匹配后再进行全量爆破。通常只需要前三个随机数即可锁定种子范围,大大缩短计算时间。最后将算出的种子代入原代码逻辑,即可成功计算出正确的 token 值,拿到 Flag。

目录

  1. 1. 从“爆个锤子”到“伪随机数”的认知升级
  2. 2. phpmtseed:伪随机数的“时光倒流”机器
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 鸿蒙金融理财全栈项目:安全合规与用户体验优化
  • Clawdbot 部署 Qwen3:32B:解决 Token 过期前端无提示及 URL 刷新问题
  • 2022 年全球软件工程师薪酬排行榜数据解析
  • 知网AIGC检测怎么过?2026最新降AI率全流程攻略
  • 熔断降级深度解析:Resilience4j 状态机、Fallback 与限流算法
  • LeetCode 20. 有效的括号(栈结构详解)
  • Python 爬虫零基础入门:系统路线与工程化实战
  • 渗透测试入门指南:技能、方向与实践
  • VS Code 远程模式下 GitHub Copilot 无法使用的解决方案
  • 树莓派 5 结合 Whisper 与 EdgeTTS 构建全离线语音助手
  • SystemVerilog 从基础到高级验证实战指南
  • Vue3 前端面试核心 20 题详解(含代码实战)
  • Jetpack Compose 与 Flutter 技术选型对比指南
  • 结合 wxauto 与 AI 大模型实现智能微信聊天机器人
  • STL Vector 模拟实现:从底层原理到核心接口解析
  • Stable Diffusion WebUI 本地部署完整教程
  • 基于 Vue 3 的情侣双人飞行棋游戏源码
  • AutoGPT 与 Python:构建自主 AI 智能体的实战指南
  • 电力巡检设备状态检测数据集:缺陷检测与分类
  • PLI 接口与 VCS 调试:连接 Verilog 与 C/C++ 的桥梁

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online