根据前期分析得知,所求目标是一个长度小于等于
9
位的数字,而且值在
0x1000
到
0x100000000
之间。虽然不能明白具体含义,但是暴力求取肯定是可行的。
一开始对随机取值的含义没有理解,把rand全部取返回
0
,导致走了一会儿弯路,很快就发现固定随机数和真实随机数的执行结果不同。也就是题目求取的是一个满足极大概率的情况,而不是所有概率的情况。
因为题目自带的多线程和锁操作很容易导致多花时间,因此先随便根据ida的反编译结果写了
64
位的代码放到机器上跑,结果跑了一天半全部跑完都没结果。很可能是自己的代码恢复的不对,因此只要调用原程序跑。
又根据小于1024时的经验和题意,应该是求取满足条件的最小值,因此满足条件的数可能有很多,因此编写代码从最高位开始求取,很快就搜索到符合条件的一个值,然后再递减确认,直到找到最小值,就是答案。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
就是常规穷举。针对具有大片连续结果的穷举,如果从最低bit位一个个搜索,每次都使用i++,显然效率低下,因此可以切换思路。假如我们猜测至少有连续的16个结果,那么可以使用i+=0x10进行搜索,这样我们跳过了最低4个比特的搜索,速度提升了16倍。但是这题并不明确连续结果的长度,但是给定了结果的上限0x100000000,这样我们就可以从最高比特开始搜索,相当于把1、2、3、4、5这几个字高低比特反序,这样搜索的值依次为0x80000000、0x40000000、0xc0000000、0x20000000、0xa0000000.因为这题的连续结果很多,且只有一片,因此这种搜索速度非常快,基本低12比特都跳过了,穷举空间只有20比特左右。我记得搜索出的结果类似是0xXXXXX000,经过验证结果的正确性后,顺着这个数继续二分搜索低位的3个0(12比特)就行了。