Chybeta

Pwnable.kr:random

伪随机

random

先file看一下

IDA打开

可以看到程序读入 v4 ,跟 v5 进行异或操作,若结果为 0xDEADBEEF ,则可以读取到flag。其中 v5的初始值由 rand()指定。

rand()

rand()产生伪随机数。伪随机数的“随机”之处是它的种子(seed)。种子确定后,按照一定算法所计算出来的随机数序列也就完全确定了。

C语言中,可以通过 srand() 来指定种子(seed)。如果用户在调用 rand()之前没有调用过 srand(),则系统默认种子为 1 。测试如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
unsigned int random1;
random1 = rand();
printf("No srand():\n");
printf("random1 = %u\n", random1);
unsigned int random2;
srand(1);
random2 = rand();
printf("srand(1):\n");
printf("random2 = %u\n", random2);
unsigned int random3;
srand(2);
random3 = rand();
printf("srand(2):\n");
printf("random3 = %u\n", random3);
return 0;
}

Exp

由以上分析可知,v5的值其实是确定的,为 1804289383。
而判断条件(v5 ^ v4) == 0xDEADBEEF 等价于 v4 == 0xDEADBEEF ^ v5 。运算可得 1804289383 ^ 0xDEADBEEF = 3039230856。所以我们要给 v4 传入 3039230856 。

1
2
3
4
random@ubuntu:~$ ./random
3039230856
Good!
Mommy, I thought libc random is unpredictable...

FLAG: Mommy, I thought libc random is unpredictable…

微信扫码加入知识星球【漏洞百出】
chybeta WeChat Pay

点击图片放大,扫码知识星球【漏洞百出】

本文标题:Pwnable.kr:random

文章作者:chybeta

发布时间:2017年04月09日 - 09:04

最后更新:2017年07月28日 - 15:07

原始链接:http://chybeta.github.io/2017/04/09/Pwnable-kr-random/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。