web25
这道题真是挺坐牢的
<?php
error_reporting(0);
include("flag.php");
if(isset($_GET['r'])){
$r = $_GET['r'];
//设置随机数种子,取flag的md5值的前8位作为随机数种子
mt_srand(hexdec(substr(md5($flag), 0,8)));
//变量rand的值是get到的r的值减去生成的随机数
$rand = intval($r)-intval(mt_rand());
//这里rand的值为0才行
if((!$rand)){
//cookie的值要等于两次生成的随机数的值才输出flag
if($_COOKIE['token']==(mt_rand()+mt_rand())){
echo $flag;
}
}else{
echo $rand;
}
}else{
highlight_file(__FILE__);
echo system('cat /proc/version');
}
1.先使get的r=0,这样rand=0-mt_rand,可以得到生成的随机数的负值
所以生成的mt_rand为429635991
2.mt_srand()是伪随机,通过分发种子,如果有种子的话,生成随机数的值也是固定的,生成的值也和php的版本有关</