这题其实也是伪随机数的知识点,我认为强调不同的版本结果不一样
先来分析代码
error_reporting(0);
include("flag.php");
if(isset($_GET['r'])){
$r = $_GET['r'];
mt_srand(hexdec(substr(md5($flag), 0,8)));
$rand = intval($r)-intval(mt_rand());
if((!$rand)){
if($_COOKIE['token']==(mt_rand()+mt_rand())){
echo $flag;
}
}else{
echo $rand;
}
}else{
highlight_file(__FILE__);
echo system('cat /proc/version');
我们想要flag.php,就需要让token=两个随机数的和,要知道这两个随机数,就要知道他的种子。
这个种子由flag的哈希值得来。
我们让r=0.这样得出第一个生成的随机数,然后根据这个随机数去倒推种子。
我们用php_mt_seed:一个专门用于从已知随机数逆推出 Mersenne Twister 种子的工具。具体用法怎么用见ctfshow-web入门-爆破(web25)及php_mt_seed工具的安装与使用_ctfshow web25-CSDN博客
我们得到token=2281919472,抓包,改写cokie,就可得