zoukankan      html  css  js  c++  java
  • 【攻防世界】对于parallel-comparator-200的理解的感想

    这是一道代码审计的题

    pthread.h库函数涉及到UNIX内核了,一些关于线程的函数现在还读不太懂。但是不妨碍我们做题。

    主函数告诉我们输入flag到user_string函数中。然后is_ok是函数high_optimized_parallel_comparsion的返回值。我们要做的是让这个函数的返回值为1。

     

    进入函数high_optimized_parallel_comparsion:

    函数的一部分是在告诉我们:

    声明了两个变量:initialization_number和first_letter,这两个变量下面都要用到。

    initialization_number是一个大于64的随机数,而first_letter是前面那个数对26取模再加97;

    一个数对26取模,取模后的数的范围是0-25,所以我们反推initialization_number的范围是97-122;

     

    接下来的pthread_create函数用到了checking函数,我们先往下看。

     

     

    这里声明了result,根据最后的函数我们可以得知,reault必须为0。

     

    而恰好checking函数会返回result的值:

     

    将checking函数和high_optimized_parallel_comparsion函数中的pthread_create函数相结合,我们可以分析出来:argument[0] 是first_letter,argument[1] 是数组differences中对应下标的值,而argument[2]就是我们要输入的对应位置的字符。

     

    经过一番逆向推导,result的值要保持为0,那么0^任何数都是这个数本身,所以我们有:

     

    argument[2] = argument[0] + argument[1]

     

    既有:我们输入的字符由first_letter和数组differences组成。

    换句话说,我们只要知道first_letter,知道initialization_number是多少,就可以了。

    initialization_number的范围我们在上文已经推测出,是一个定值。

    经过爆破我们可以得到自己想要的答案:

     

     

    实际上涉及到的进程函数我还是很想搞明白的,但是要搞明白的话就需要了解更多的知识。慢慢来吧,从语言到操作系统到内核,一口可吃不成个胖子。

    虽然我想说C语言天下第一,但是不得不承认有些时候C还是比较折磨人的。

  • 相关阅读:
    作业7-英文词频统计预备,组合数据类型练习
    作业6-凯撒编码、GDP格式化输出、九九乘法表
    作业5-字符串操作
    作业3-turtle库基础练习
    作业2-Python基础练习
    理解管理信息系统
    Git-git rebase详解
    C语言中基本的数据类型
    读取配置文件的C语言接口实现
    Linux之异步IO机制分析
  • 原文地址:https://www.cnblogs.com/DorinXL/p/12726849.html
Copyright © 2011-2022 走看看