作者名:Demo不是emo
主页面链接:主页传送门
创作初心:舞台再大,你不上台,永远是观众,没人会关心你努不努力,摔的痛不痛,他们只会看你最后站在什么位置,然后羡慕或鄙夷
座右铭:不要让时代的悲哀成为你的悲哀
专研方向:web安全,后渗透技术每日emo:别来我梦里了,我已负担不起醒来的失落
题目:web25
训练平台:ctfshow
题目描述:爆个,不爆了
开启容器页面如下
那这就是一道分析代码的题了,我们来仔细读一下代码的逻辑,为了节省时间就不慢慢读了,给出逻辑如下
1、首先GET传参传入一个r变量,再将flag经过md5加密后截取前8位字符,并将截取的字符串转换为10进制,以转换后的十进制作为mt_srand()函数的种子
2、再定义一个rand变量,值为传入的r变量的值-mt_rand()生成的随机数3、若此时cookie中的token参数的值=mt_rand()第二次产生的随机数的值+第三次产生的随机数的值,那么就输出flag,否则输出rand变量的值
这里的种子(seek)没有明确给出,毕竟flag我们不知道,所以我们需要逆推出种子(seed),仔细看看这段代码
仔细观察,发现根据这个代码逻辑当我们传入的r为0时,rand的值就是负的mt_rand()产生的随机值,而我们就是要通过这个随机值倒推回flag,所以我们先GET传入r,值为0,如下
所以flag经过一系列并作为种子后产生的随机数为
1093633598
但是知道mt_rand()产生的随机数怎么逆推mt_srand()函数的种子呢?这里就要给大家介绍一个工具了,专门用来跑mt_srand()种子和 mt_rand()随机数的,名字叫php_mt_seed,
下载网站:Al1ex/php_mt_seed: php_mt_seed is a PHP mt_rand() seed cracker (github.com)
下载好后放到kali里面,步骤如下
unzip php_mt_seed-master.zip
解压Github自带的压缩包
cd php_mt_seed-master
进入解压后的文件
tar zxvf php_mt_seed-4.0.tar.gz
解压要用的脚本
cd php_mt_seed-4.0
进入解压后的工具目录
make
源码编译,使用后当前目录生成可执行文件
chmod 777 php_mt_seed-4.0
赋予执行权限
到这里工具的配置就完成了,工具的使用也很简单,用法如下
time ./php_mt_seed 需要逆推的随机数
例如这道题,命令如下
time ./php_mt_seed 1093633598
这个工具就会自己根据随机数去逆推种子的值,效果如下
注意:因为伪随机数生成规则随php版本变化而变化,所以该工具会给出不同版本的种子答案,并且该工具有时跑出来的答案不唯一,需要一个个试,但问题不大,猜测作者用的是php7环境,如果不对的话我们再换就行,上面结果中php版本跑出来的种子有两个,分别是
361284794
3041033333
先试试
361284794
再来看剩下的代码
意思是当rand等于0时,若token的值等于mt_rand()函数第二次和第三次产生的随机数之和时,打印出flag,先看看什么情况下rand=0呢?就是我们传入的r的值等于mt_rand()产生的第一个随机数时
所以这里mt_rand()产生的三个随机数我们都要用,那我们直接写个代码得到这三个随机数的值
代码如下
得到三次随机数的值
1093633598
1103641603
859442013
所以我们按代码中输出flag的要求传入参数
首先把第二次和第三次随机数相加的值传入cookie的token参数,如下
再GET传参传入r,值为产生的第一个随机数 ,结果如下
那么到这里这道题就拿下了, Game over,明天见同学们,有什么问题随时欢迎私信问哦。