先看一下页面源代码
发现有个check.php,访问一下
得到源码
AivuIrdRFR
<?php
#这不是抽奖程序的源代码!不许看!
header("Content-Type: text/html;charset=utf-8");
session_start();
if(!isset($_SESSION['seed'])){
$_SESSION['seed']=rand(0,999999999);
}
mt_srand($_SESSION['seed']);
$str_long1 = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$str='';
$len1=20;
for ( $i = 0; $i < $len1; $i++ ){
$str.=substr($str_long1, mt_rand(0, strlen($str_long1) - 1), 1);
}
$str_show = substr($str, 0, 10);
echo "<p id='p1'>".$str_show."</p>";
if(isset($_POST['num'])){
if($_POST['num']===$str){x
echo "<p id=flag>抽奖,就是那么枯燥且无味,给你flag{xxxxxxxxx}</p>";
}
else{
echo "<p id=flag>没抽中哦,再试试吧</p>";
}
}
show_source("check.php");
这个mt_srand()函数,它的作用是给随机数发生器播种,播种会初始化随机数生成器。语法为mt_srand(seed),其seed参数为必须。大多数随机数生成器都需要初始种子。在PHP中,因为自动完成,所以mt_srand()函数的使用是可选的。从 PHP 4.2.0 版开始,seed 参数变为可选项,当该项为空时,会被设为随时数。播种后mt_rand函数就能使用Mersenne Twister算法生成随机整数。
但是用这个函数时会存在一些问题,每一次调用mt_rand()函数的时候,都会检查一下系统有没有播种,(播种是由mt_srand()函数完成的),当随机种子生成后,后面生成的随机数都会根据这个随机种子生成。所以同一个种子下随机生成的随机数值是相同的。同时,也解释了我们破解随机种子的可行性。如果每次调用mt_rand()函数都需要生成一个随机种子的话,那根本就没办法破解。
这道题给了随机数列,需要找到随机种子,
脚本:
str1 ='RJopyu6EO7'
str2 = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
result =''
length = str(len(str2)-1)
for i in range(0,len(str1)):
for j in range(0,len(str2)):
if str1[i] == str2[j]:
result += str(j) + ' ' +str(j) + ' ' + '0' + ' ' + length + ' '
#前两是值,后两个是mt_rand输出的值区间
break
print(result)
运行得到:
53 53 0 61 45 45 0 61 14 14 0 61 15 15 0 61 24 24 0 61 20 20 0 61 32 32 0 61 40 40 0 61 50 50 0 61 33 33 0 61
使用php_mt_rand爆破mt_rand()函数产生的随机数的种子值
得到
542402952
然后
<?php
mt_srand(542402952);
$str_long1 = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$str='';
$len1=20;
for ( $i = 0; $i < $len1; $i++ ){
$str.=substr($str_long1, mt_rand(0, strlen($str_long1) - 1), 1);
}
echo $str;
?>
得到
RJopyu6EO7WoI0ZfYwf5
提交得到flag