php伪随机数 ctf,[GWCTF 2019]枯燥的抽奖

题目一览

ec179d36-2a94-40b2-9086-ee2991968038.png

直接看源码,发现输入的值会被POST的check.php:

9b868531-f5bd-4fcb-b635-760893cb24c4.png

访问一下Check.php,给了源码:

d1fd056e-684b-40e6-80a1-ff13fd789704.png

分析吧。

分析: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首先rand()初始化session,然后作为种子传给mt_srand.

之后构造20位密码,只截取前10位给你。

如果最后能POST正确的20位,获得flag。

那么关键就是,要根据给你的10位密码,反推出mt_srand的种子是什么,从而依葫芦画瓢构造私钥。

之前做过的[MRCTF]Ezaudit里学习了这个问题,这回实践一波。

Step 1 因为要交给php_mt_seed去跑,我们先把给的密码转成它能读懂的形式:

$pass = "2dHUhTubvf"; //密钥

$alphabet = ‘abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ‘;//字母表

$len = strlen($alphabet) - 1; //区间长度

for($j = 0; $j < strlen($pass); $j++) //遍历密钥,确定当前字符在密钥的顺序

{

for ($i = 0; $i <= $len; $i++) { //遍历字母表,确定当前字符在字母表的顺序

if($pass[$j] == $alphabet[$i])//是找到了对应的随机数

{

echo "$i $i 0 $len "; //输出符合要求的参数格式

break;

}

}

}

?>

获得结果:

28 28 0 61 3 3 0 61 43 43 0 61 56 56 0 61 7 7 0 61 55 55 0 61 20 20 0 61 1 1 0 61 21 21 0 61 5 5 0 61

Step 2 利用php_mt_seed去爆破种子:

0788b2a7-3808-484b-97f0-5365abe7dd27.png

成功获得种子。注意有版本要求 PHP 7.1.0+

Step3 还原:

mt_srand(119825810);

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

?>

用phpstudy环境,在PHP 7.1.13下跑出来的结果:

fb64efd9-f745-4f5f-83b0-177e829cada2.png

前10位完美匹配,爆破成功:

f49abc67-ba73-45a9-b54e-f17ffe482682.png

Step 4

提交

2954bfe7-714f-4631-8f7c-75357f54d551.png

flag到手:

6d4307d3-82f8-4459-932b-b5810e7134c9.png

这道题当初比赛的时候没做出来(整个就做出来一道Web……)。

最近刷了不少题,做到这个了,尝试一波,没想到拿下了。

而且还考的是之前刷题时研究过的知识点。挺高兴的,记录一下!希望之后更进一步!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值