RE-攻防世界 T3 insanity

Posted xxx-echoed

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RE-攻防世界 T3 insanity相关的知识,希望对你有一定的参考价值。

 难度系数:3.0 

题目来源: 9447 CTF 2014

题目描述:菜鸡觉得前面的题目太难了,来个简单的缓一下

拿到这个文件之后,有点窒息

看看这个文件名!!!这不跟上一道折磨我的PWN题似得吗!!!一个妈生的吧,名都差不多!!!

技术图片

 

 技术图片

由此可以猜测应该是ELF文件

言归正传,首先将文件拖入虚拟机,file查询一下信息,发现是个32位的ELF文件(Linux下的执行文件格式)

技术图片

 

 拿到 IDA 里看一看

 1 int __cdecl main(int argc, const char **argv, const char **envp)
 2 {
 3   unsigned int v3; // eax
 4   unsigned int v4; // eax
 5 
 6   puts("Reticulating splines, please wait..");
 7   sleep(5u);
 8   v3 = time(0);
 9   srand(v3);
10   v4 = rand();
11   puts((&strs)[v4 % 0xA]);
12   return 0;
13 }

 

1.srand函数是随机数发生器的初始化函数。srand和rand()配合使用产生伪随机数序列。


void srand(unsigned seed);
参数seed是rand()的种子,用来初始化rand()的起始值。
可以认为rand()在每次被调用的时候,它会查看:
1) 如果用户在此之前调用过srand(seed),给seed指定了一个值,那么它会自动调用srand(seed)一次来初始化它的起始值。
2) 如果用户在此之前没有调用过srand(seed),它会自动调用srand(1)一次。

 

种子:C语言利用rand()函数取得随机数的时候是通过一个叫做“种子”的变量经过计算得出一个数值,然后得出的数值再作为“种子”参与下一次的运算,这样就得到了所谓的随机数,而srand()的作用就是用给定的数字来代替种子,比如用当前的时间做种子,因为每次运行程序时间都不一样,所以rand()函数给出的随机数也不一样,这样能使随机函数更具有随机性。

 

2.C 库函数 time_t time(time_t *seconds) 返回自纪元 Epoch(1970-01-01 00:00:00 UTC)起经过的时间,以秒为单位。如果 seconds 不为空,则返回值也存储在变量 seconds 中

 

那么这个程序的意思就很明白啦

1 v3 = time(0);
2 srand(v3);
3 v4 = rand();

这几句是产生随机数

1 puts((&strs)[v4 % 0xA]);

这句是生成10以内的随机数放到字符串strs中。

 

我们看懂了该程序后,发现关键在于strs,要求的flag应该就在strs中

点开str查看后

嗯?这怎么这么像Flag

技术图片

 

 输入尝试一下,确实是flag。

啊这,挺惊喜的。

(小声bb 其实不用分析程序....看人家大佬的WP直接记事本打开搜索flag就出来了或者在IDA中直接shift+F12查看字符串也可)

以上是关于RE-攻防世界 T3 insanity的主要内容,如果未能解决你的问题,请参考以下文章

[一千道逆向题] 攻防世界1-5题刷题题解(偏动调)

[一千道逆向题] 攻防世界1-5题刷题题解(偏动调)

[一千道逆向题] 攻防世界1-5题刷题题解(偏动调)

[一千道逆向题] 攻防世界1-5题刷题题解(偏动调)

攻防世界--re1

2019.8.31-9.3 攻防世界RE练习