【攻防世界】REVERSE新手练习区 - open source

open source-wp
打开附件得到一段源码:
【攻防世界】REVERSE新手练习区 - open source
分析方框1中的内容可得,输出的hash即为正确的flag。而hash的值与first,second的值和argv[3]的长度有关。因此我们需要求出first,second和argv[3]。

首先根据方框2中的内容求first的值:
【攻防世界】REVERSE新手练习区 - open source
如果(first 不等于 0xcafe),会得到( “你错了,对不起。”)。
说明 first要等于0xcafe 。0xcafe是十六进制的数,用计算器将它转化成十进制数:
【攻防世界】REVERSE新手练习区 - open source
则得出 first = 51966

接着根据方框3中的内容求second的值:
【攻防世界】REVERSE新手练习区 - open source
当second满足(second % 5 == 3 ll second % 17 != 8)条件时,则输出 (“ha,you won’t get it!\n”),意为“你将不能得到它!”。也就是说要想得到正确的second,second必须满足second % 5 != 3和second % 17 == 8这两个条件。
容易得出同时满足这两个条件的最小的数是25,因此 second=25

然后根据方框4中的内容求argv[3]的长度:
【攻防世界】REVERSE新手练习区 - open source
如果"h4ckyou",和argv[3]相等则得到 (“so close,dude! \n”),意为“如此接近真相了,伙计。” 因此可得出 argv[3]=“h4ckyou”。
则 strlen(argv[3])=7 。

最后得出hash的值:
将first,second和argv[3]代入

unsigned int hash = first* 31337 +(second % 17) * 11 + strlen(argv[3]) - 1615810207

中得

unsigned int hash = 51966* 31337 +(25 % 17) * 11 + 7 - 1615810207

将数据用计算器中计算得到 hash=c0ffee 。
注意:源码中输出的hash为%x型,%x表示以十六进制数形式输出的整数,%x中x为小写字母,因此hash中的字母取小写。
【攻防世界】REVERSE新手练习区 - open source
也可以在利用python计算一下:
【攻防世界】REVERSE新手练习区 - open source
则得到 flag = c0ffee 。

上一篇:SQL 语言的概述 | 学习笔记


下一篇:python 实现数组反转