【攻防世界】对于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还是比较折磨人的。

posted @ 2020-04-18 17:10  DorinXL  阅读(397)  评论(0编辑  收藏  举报
👨‍💼