难度系数: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查看字符串也可)