Loading

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 "<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");

可以看到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'<br>';

 

 

posted @ 2021-11-15 23:10  Aninock  阅读(23)  评论(0编辑  收藏  举报