zoukankan      html  css  js  c++  java
  • 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查看字符串也可)

    你做的每件事都值得。 ——yaerda
  • 相关阅读:
    将图片保存到数据库中及转换
    svn 插件地址
    反射
    android 使用Sax 读取xml
    抓取 网页信息
    客户端测试
    简单多线程+委托+事件
    postman实战四
    Postman练习
    Jmeter练习二添加书籍信息
  • 原文地址:https://www.cnblogs.com/XXX-Echoed/p/13048825.html
Copyright © 2011-2022 走看看