CTFShow


CTFShow做题记录

从学姐手里买了一个CTFShow的会员,有点点肉疼,既然买了,就得刷完,记录一下做到的比较有趣的题目,长期更新

Web25

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-03 13:56:57
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-03 15:47:33
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


error_reporting(0);
include("flag.php");
if(isset($_GET['r'])){
    $r = $_GET['r'];
    mt_srand(hexdec(substr(md5($flag), 0,8)));
    $rand = intval($r)-intval(mt_rand());
    if((!$rand)){
        if($_COOKIE['token']==(mt_rand()+mt_rand())){
            echo $flag;
        }
    }else{
        echo $rand;
    }
}else{
    highlight_file(__FILE__);
    echo system('cat /proc/version');
} 

打开就是源码,这里主要考的是mt_rand和mt_srand这两个函数,说实话,我还是第一次碰到这个,所以好好记录一下

mt_scrand(seed)这个函数的意思,是通过分发seed种子,然后种子有了后,靠mt_rand()生成随机数。

<?php  
mt_srand(12345);    
echo mt_rand()."<br/>";
echo mt_rand()."<br/>";
echo mt_rand()."<br/>";
echo mt_rand()."<br/>";
echo mt_rand()."<br/>";
?>    

当我们多次输出这个的时候,我们可以发现输出值是一样的,所以事实上mt_rand生成的是伪随机数。

知道种子后,可以确定你输出伪随机数的序列。
知道你的随机数序列,可以确定你的种子。

这道题虽然种子没有给出,但发现一个关键地方,就是我们可以把传入的r设置为0,即?r=0,可以输出$rand的值,此时$rand=mt_rand()的值,也就是随机数的值。

获得随机数为86715576,这个时候我们使用逆推工具尝试逆推出种子

工具地址:https://github.com/Al1ex/php_mt_seed

git下载方式:git clone https://github.com/Al1ex/php_mt_seed
下载后命令行输入make然后回车编译出php_mt_seed文件

得到种子为4277818166

因为$_COOKIE[‘token’]的值要等于两个随机数相加,于是我们写个脚本

<?php
/**
 * Author:dota_st
 * Date:2021/2/2   11:31
 */

mt_srand(4277818166);
echo mt_rand()."\n";
$result = mt_rand()+mt_rand();
echo $result;

得到最终结果,传入?r=1321508915,cookie内传入token=1560870625,得到flag


文章作者: Cu3tuv0
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Cu3tuv0 !
评论
  目录