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'
';