当前位置:首页 > 黑客业务 > 正文内容

glibc库中rand函数的完成详解与猜测方法

访客4年前 (2021-04-15)黑客业务839


感谢0CTF,上交大这次举办了一个挺有深度的CTF竞赛。
这次竞赛有一道web题,标题很简略,大致如下:
include('config.php');
session_start();
if($_SESSION['time'] && time() - $_SESSION['time'] > 60) {
    session_destroy();
    die('timeout');
} else {
    $_SESSION['time'] = time();
}
echo rand();
if (isset($_GET['go'])) {
    $_SESSION['rand'] = array();
    $i = 5;
    $d = '';
    while($i--){
        $r = (string)rand();
        $_SESSION['rand'][] = $r;
        $d .= $r;
    }
    echo md5($d);
} else if (isset($_GET['check'])) {
    if ($_GET['check'] === $_SESSION['rand']) {
        echo $flag;
    } else {
        echo 'die';
        session_destroy();
    }
} else {
    show_source(__FILE__);
}
彻底没有其他考点,便是让你猜测rand()的输出。看起来确实十分简略,名为rand()的函数实践上是伪随机函数生成器,是可以进行猜测的。并且标题不约束提交次数,约束两次提交的时刻距离,连敌手进犯模型都固定了:不该该用暴力拆解(可是我用了),而是经过若干次恳求之后可以搜集数据猜测之后的rand()函数输出。
国内查了许多材料都没找到关于rand()函数的完结细节。自己也拙,没有直接去找源码,而是相信某篇文章,进行爆炸。成果命运欠好,只能gg。
现在看完国外的博文之后才知道正确解法。原文具体论述了glibc中rand函数的用法,英文好的可以直接读原文 http://www.mscs.dal.ca/~selinger/random/ 。为了日后便利我将大致内容翻译收拾如下:
 rand()由一个种子(singned int seed)进行初始化,生成的进程对错线性的。可是linux中man有些小误导,在初始化完结之后,随机数的生成便是线性的,实践上是以个线性移位反应寄存器。给没学过暗码学的安利一下最简略的状况,线性移位反应寄存器实践便是把之前某几个特定位的输出取出来,进行一个操作(八成异或),然后作为现在的输出。常见于一些流暗码的生成进程。这东西咱们可以类比斐波那契序列进行了解。
如此,rand()可破,拿到满足的旧输出就行。那么rand()是怎么作业的呢?rand()种子规模是0~2147483647(2**31-1),初始化对前34个内部向量r0~r33,操作如下:
(1) r0 = s
(2) ri = (16807 * (signed int) r(i-1)) mod 2147483647 (for i = 1...30)
(3) ri = r(i-31) (for i = 31...33)
留意到乘16807这一步是在满足大的signed Int中进行的,所以在模运算之前不会发作溢出。并且在乘法之前,ri-1 也被转化为了 signed 32-bit int 。可是这个值仅有或许的负值出现在i=1的时分,即当s>=2**31时。由上能看出模运算便是0~2147483646之间的一个值,即使前一个数是负的。
所以,r34便是按如下的反应循环进行的:
(4) ri = (ri-3 + ri-31) mod 4294967296 (for i ≥ 34)
r0…r343 会被丢掉,第一个输出Oi实践上是:
(5) oi = r(i+344) >> 1
留意这个右移一位操作,丢掉了最终一bit,实践有用比特数为31位。
线性性质剖析:
虽然最终一位被丢掉了,可是影响并不大,咱们仍然可以得到线性性质很好的输出序列。结合(4)、(5)式可得:
(6.1) oi = o(i-31) + o(i-3) mod 2**31, for all i ≥ 31
or 
(6.2) oi = o(i-31) + o(i-3) + 1 mod 2**31, for all i ≥ 31
原文也给出一个C言语完结的简略版别random函数,附之于下:
#include
#define MAX 1000
#define seed 1
main() {
  int r[MAX];
  int i;
  r[0] = seed;
  for (i=1; i31; i++) {
    r[i] = (16807LL * r[i-1]) % 2147483647;
    if (r[i] 0) {
      r[i] += 2147483647;
    }
  }
  for (i=31; i34; i++) {
    r[i] = r[i-31];
  }
  for (i=34; i344; i++) {
    r[i] = r[i-31] + r[i-3];
  }
  for (i=344; i-31] + r[i-3];
    printf("%dn", ((unsigned int)r[i]) >> 1);
  }
}
 

扫描二维码推送至手机访问。

版权声明:本文由黑客接单发布,如需转载请注明出处。

本文链接:http://therlest.com/106732.html

分享给朋友:

“glibc库中rand函数的完成详解与猜测方法” 的相关文章

猪肉怎么选?颜色有区别吗?今天做饭的时候发现上次买的猪肉颜色跟这

猪肉怎么选?颜色有区别吗?今天做饭的时候发现上次买的猪肉颜色跟这 买猪肉时,根据肉的颜色、外观、气味等可以判断出肉的质量是好还是坏。优质的猪肉,脂肪白而硬,且带有香味。肉的外面往往有一层稍带干燥的膜,肉质紧密,富有弹性,手指压后凹陷处立即复原。 次鲜肉肉色较鲜肉暗,缺乏光泽,脂肪呈灰白色;表面带...

蚯蚓的市场价格 - 2020年蚯蚓收购价格

今年2020年这个价格还算是比较合理,市场价格较为平稳,当地蚯蚓批发价250元/万条,今日浙江海宁地区鲜蚯蚓批发价为17,最高可卖3元/两,每次都-是老家亳州的来回辗转的跑辛苦.货源充足,现在贩子登门收购18-222020元/斤不等。 目前价格多少钱一斤目前价格在8元一斤,是一种营养价值很高的无脊椎...

今天猪肉价格多少钱一斤 「未来10天毛猪价格」

但是价格便宜点。比昨天下降 0点8;鸡蛋8点,我今天出售5头价格14点00,价格稳定;江苏活猪价15元/公斤左右,规模场品种猪价格在6点50-6,猪价或将有所回暖,点70元/斤之间,年的低迷期。 去年9月份以来,89元/公斤,山东省普通猪价格大约在6,从春节时的最高15元/公斤左右价格,现在江苏生猪...

蜂胶多少钱一瓶是真的(蜂胶五毒膏多少钱一只)

之前听说这客户有糖尿病,蜂胶就是物稀价贵,变成日常可以食用的营养品。 我经常买的澳佳宝的120左右220粒。如果是纯蜂蜜的话,一般是100-300之间的,59块钱一瓶,在100~300是左右不等,总钱黄酮大于4000mg/100g的含量,一定要注意通过正规的渠道购买,我只知道麦金利的。 蜂胶软胶囊价...

存储过程oracle(oracle财务系统)

推荐教程:甲骨文教程 本文主要介绍甲骨文中的数据转换。 1.日期转换成字符串(以2016年10月20日为例) 选择to_char(sysdate,& # 39;yyyy-mm-DD hh24:mi:ss & # 39;)strDateTime从dual-获取年-月-日:分:秒-...

宝马3系全下来多少钱 「宝马3系320li落地价」

全国最低价为24点36万,价数字的意思如下:1、一般下来要28下来左右,北京的 裸车是22点5万,字母的意思如下:L是,贵吗.钱2020款宝马。 最不满意的一点,适合追求高配置的消费者了,你会觉得这就是你最正确的选择。王斩2015/07/2023:22:05发表在板凳无事故果断拿下新车落地接近50万...

评论列表

丑味败骨
2年前 (2022-07-07)

) - $_SESSION['time'] > 60) {    session_destroy();    die('timeout');} else {    $_SESSION['time'] = time();}echo rand();i

只影辙弃
2年前 (2022-07-07)

rce(__FILE__);}彻底没有其他考点,便是让你猜测rand()的输出。看起来确实十分简略,名为rand()的函数实践上是伪随机函数生成器,是可以进行猜测的。并且标题不约束提交次数,约束两次提交的时刻距

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。