BUUFTC-日刷-[GWCTF 2019]枯燥的抽奖-php伪随机数


给你10位乱码,让你猜后面10位,这里能猜出来算运气好(bushi

查看前端代码:

访问check.php

<?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 "

".$str_show."

"; if(isset($_POST['num'])){ if($_POST['num']===$str){x echo "

抽奖,就是那么枯燥且无味,给你flag{xxxxxxxxx}

"; } else{ echo "

没抽中哦,再试试吧

"; } } show_source("check.php");

可以看到session里面seed是一个随机数,范围从0到999999999

然后以seed为种子生成随机数,然后输出前10位,那么就要想办法拿到seed然后生成出20位即可

一开始想暴力破解来着,但是跑了一会不现实,然后就百度搜一下,发现有工具可以利用

这里可以用使用php_mt_seed4.0工具爆破seed

注意这个工具要输入参数,因为给我们的10位字符串是根据随机数在表里对应生成,跑个脚本生成参数

str1='abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
str2='BKiiGc4geA'
str3 = str1[::-1]
length = len(str2)
res=''
for i in range(len(str2)):
    for j in range(len(str1)):
        if str2[i] == str1[j]:
            res+=str(j)+' '+str(j)+' '+'0'+' '+str(len(str1)-1)+' '
            break
print(res)

将生成的序列作为参数带入运行:

求出种子 360523220,带入脚本跑即可

<?php
mt_srand(360523220);
$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, 20);
    print_r($str);
    echo'
';

相关