看雪大佬太强了,菜鸡误入结果一个国庆都飞掉了。。。
题目之所以叫叹息之墙似乎是因为这个题目在IDA里面看起来是这样的:
太吓人了。。。
首先执行程序:
输入数字,然后程序内部会对数字进行运算处理,从而检查输入是否正确。不过其中最坑的地方在于不超过9个数字。这样似乎输入的限制就有、、小了。。。
逆向第一步自然是分析逻辑。。。但是这个程序这么大,实在是难以分析的样子。不过调试了几下之后发现了几个规律:
对于第三点,我们可以看到,程序中大部分的混淆逻辑都是这个样子的
还有一种是使用add
/sub
的混淆
这两种运算本质上并没有做什么有意义的事情,但是如果出现strlen
,__aullrem
这类函数的话,很有可能就是一个重要的内容,于是这边用idapython标记了一下当前的程序中用到这些函数的地方:
顺着这几个地方,找到了输入进行处理的逻辑
这里出现了第一个全局变量GlobalIndex,这个变量会将通过了程序验证的数字存放在这个整数数组中。r顺着这个变量,找到了第二个全局变量
吐槽一下,这个变量其实有好几个地方都有引用,但是似乎不是所有的地方都执行了一遍。。。
这个TargetMagic
是一个存放了351个整数的变量。观察上面的这段逻辑,我做出一个猜测:这个地方可能在操作一个64bit的数字,因为这个地方用了adc汇编(好像没有啥道理?只是直觉)
整体的逻辑大概是这样的:
大概就猜测到这个地方,好像就没有思路了。。。于是我们检查一下有没有什么可疑的字符串:
找到这个地方又有了新的线索:这一段显然是用于判断输入逻辑的,不过我们发现跟踪进去并不方便,因为这个程序本身被切分成了跳转模块和执行模块,这个跳转模块和执行模块之间的关系还特别复杂,存在很多用于混淆视听的需要跳转模块。。所以我这里决定用IDAPython再次辅助检查程序。通过使用idapython找到当前模块中的跳转和入口的对应关系,然后进行程序流的逆向追踪,然后大致就写了一个忙放辅助的脚本
emmmm..里面也有一些变量命名有点奇怪。。不过最后还是成功的找到了几个关键的调试逻辑
通过脚本分析可以发现,这个地方的逻辑会最终影响是否跳转到“成功”逻辑上,因此这个地方显然是一个关键的函数逻辑,其中这个SRC
和DST
分别对应字符串eux2
和nak4
。不过这个地方其本身是作为一个整数存在的。这段逻辑翻译一下的话就是:
于是现在的关键变成了这个GroupMul
函数。我们跟踪进去,会发现两个关键的比较逻辑:
这个关键逻辑处,会将当前我们传入的sum处理,之后会处理SRC变量,翻译一下就是:
然后是第二段
这一段则是处理关键的返回值的。
将上面两段汇编合并一下,就能够得到一个这样的函数:
调试中发现,第二段判断逻辑似乎不是每一次都会进入的,于是必然是有一个判断的逻辑在。顺着跳转的魔数返回寻找,能够找到这样的两段:
这两段代码正好决定了此时的程序会不会进入第二段影响返回值(这里设为A)的判断逻辑。通过调试发现,这里是在检查sum的最低位是否为1。那么此时整个判断逻辑就能够重现了:
至此,整个程序逻辑大概为:
有了整体逻辑,那么此时我们的目标就很明确了:
如果仔细思考上述逻辑的话,会发现其实这个运算过程就是SRC的sum次方模0xFFA1CF8F,于是还能进一步化简为:
这个时候,SRC的运算相当于是一个群
因此我们第一个目标就很明确了
于是尝试爆破:
这里考虑到,TargetMagic
中的数字最大也为0xfeb053fc,若9次都取到这个数字也不会超过0x900000000,所以这里爆破次数仅为
[0,0x900000000]
然后能够得到这几个数字:
不过之后就很麻烦了,如果要从这么多的数字里面找到几个数字,相加正好又是我们目标值中的其中一个,实在是太复杂了。瞎摆弄的时候,突然发现如下规律
无意中对数组进行了排序(原先目的忘记了),突然发现第一个数字是后几个数字的倍数,于是想到
会不会是整个数组都是由这个数字生成的呢?
于是试着找了一下,总共有270个数字是由其生成的。发现这个思路可行,于是写了个脚本,找到了其中所有的生成元:
于是这个题目突然之间转变成了如下的形式
将这几个数字设为变量a,b,c,d....然后进行一个多项式求解,等式的右边就是之前爆破出来的幂次。哪一个幂次能找到合适的解,就利用这个解反推出我们选取的TargetMagic
于是这里使用Z3进行计算:
之后能够发现,在幂次为0x453995a4d
的时候,能够得到一个解:
我们找到其中每一个下标,最后翻出其位置并且排序(题目要求),就能够得到最终的答案.
17x27x60x97x133x161x243x292x309X
完结撒花!
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)