题目

来自CTFSshow-WEB24

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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');
}

解题步骤

先测试r=0,网页回显-1387662750,得到随机数mt_rand()=1387662750

由于要让!$rand条件成立,获取flag的r=1387662750

php_mt_seed 4.0

下载编译

image-20210909124135307

image-20210909124106797

mt_rand()相加前,intval($r)-intval(mt_rand());就调用过一次mt_rand(),所以才有中间的,echo mt_rand()."\n";

1
2
3
4
5
<?php
mt_srand(2704363133);
echo mt_rand()."\n";
echo mt_rand()+mt_rand();
?>

添加cookie到数据包

image-20210909124222921

题目原理

mt_scrand(seed)这个函数的意思,是通过分发seed种子,然后种子有了后,靠mt_rand()生成随机数。

生成伪随机数是线性的,你可以理解为y=ax,x就是种子,知道种子和一组伪随机数不是就可以推y(伪随机数)

如题目,让r=0就知道y的第一个确定值,通过爆破a,就能确定种子

image-20210909125628570

参考链接

https://www.cnblogs.com/zaqzzz/p/9997855.html