逆向新手踩坑指南之爬爬山能锻炼身体
首先坐下,打开电脑,平复一下心情,开始逆向分析。
软件运行一下是这样的:

直接IDA打开,字符串窗口(shift+F12):
what a f********ck???!!!这是啥?说好的字符串呢?说好的各种函数呢?
想了想忘了一件事情,先查查有没有壳:

看到了刚才的小坑,顺便在看看有没有什么加密方式:

没有,很好,直接upx脱壳,然后再次进入IDA【其实根据刚才IDA的提示也能看出来是upx的壳】:

这次看到了字符串,然后根据关键字符串交叉引用后来到函数:

直接F5:

圈一里面是什么暂时不想管,直接从18行开始基本比较明显了,一个是屏幕输出函数printf,一个是从屏幕获得输入,圈二IDA本身分析得也很明显,就是判断长度的,字符串限制为19。22行跟进去以后是这样的 :

这TM是啥?!?!?!不过结合26行,31行,37行能看到类似于a=a+b一样的东西,是从dword_41A138[]里面取值,然后直接加到dword_423D78这个变量里面。
从29行和35行能判断这个输入的字符串一定是L或者R【根据ASCII码】,既然22行不懂,就直接先动态走一走:
输入19个字符串后:

在堆栈段看到了自己的输入,然后跟进411C4F这个函数:

跟进去看得有点头晕….但是看到函数的返回值eax里面是13,换成十进制就是19,也就是这个函数是用来判断输入长度的【从IDA的整体流程也能推测出来】,继续跟:

进入411C88这个函数:

这里是一个重点,函数在这里一直在41195C和411992之间循环,并且,在411987这一步直接和4做了异或,直接导致将我们输入的字符串所有偶数位做了异或。从这一点判断,这个函数应该是IDA伪代码的第22行,对字符串进行了处理 :

处理方法就是偶数位和4做异或,根据IDA的判断,异或后的值只能是L或者R。于是再次输入的时候就知道该输入些什么了。经过反推,奇数位只能是L或者R,偶数位只能是V(代表R)或者H(代表L)。字符串输入什么变得清晰了。
直接让程序执行完,然后手动改栈里面的值,再返回:

从这里开始的一大长串我没有仔细分析,太多了,看得心烦,跟了几次以后发现总是在这里[411D97]跳转,方便起见直接这里下了断点,也在[411D9C]这里下了断点,之所以这样,是想随时关注着各个寄存器的变化和堆栈的变化 :

然后结合IDA的整个流程:

能大概推测出这里应该就是根据输入的字符串判断是在圈一还是圈二。
处理完毕以后就能直接出结果了:

还是我太天真,将输入提交以后发现并不正确。然后思路基本就卡到这里了,连续一两天没有进展,心里憋屈得不得了。后来再次看题目的时候发现题目是mountain climbing。英文翻译是爬山,爬山,爬山,山呢?!!!于是我的思路就有变成了找山…
继续回到IDA来看吧,因为已经没什么可以看的了。这次就变成了分析前面所有没分析过的函数,首先就是dword_41A138[]里面是什么?

从字面上理解rand()就是随机数函数,每次都产生不一样的随机数,然后根据这个去进行加数字的运算,这TM能算出来啥?!
然而事实告诉我还是我太天真了(原谅我大学不是计算机专业,没好好学过C….)。
c语言里面有一个产生随机数的函数,rand()。但是在学习过程中发现这是伪机的,虽然叫随机,但是每一次结果都一样(下面图片来自随便一个搜索引擎,随便一搜一大把的讲解):

于是思路一下子清晰了,srand()是一个固定的值(IDA里面对没有定义的数字后面会有一个u,undefined),那么rand()产生的数字也是固定的!!!根据代码描述,基本可以断定那个dword_41A138[]就是山了,数组下标是这样的101,201,202,301,302,303…写成这样也许更直观:

从IDA里的27行到41行看:

76(十进制ASCII码)是L,82(十进制ASCII码)是R,对应上面那张图就是从101到201是L,从101到202是R。L和R就代表了如何下山。没错,你没有看错,就是下山,不是爬山。
问题来了,根据等差数列进行算数,一共由210个数字堆成山,一共20层,走法多了去了,这TM谁知道哪条路是对的…正在一筹莫展的时候想起了这一句话:

要找最大的数,那么也简单,从下山开始,只选择最大的那个数。后来发现也不行,比如201是比202大,但是303比所有101,201,202加起来都要大,如果选了201,那么永远走不到303。这怎么办?
只能遍历了。
问题又来了,怎么遍历?!!我想到了二叉树遍历,虽然C语言忘得差不多了,但是还依稀记得一点数据结构。当我自信满满得去操作一番搜索引擎的时候又进到了一个坑里,二叉树遍历的代码是这样的(来自用搜索引擎搜索二叉树遍历后返回的一大把博客中随便一个网络博客):






已然实现了所有路径的表示方法,Nice!!!

由于强迫症的限制,我就不想在windows上跑,没环境,不想装,伟大的linux干啥都行,为啥非要在windows上吊死,于是在我的kali上跑完以后是这样的(自己又给自己挖了一个坑):







Via: freebuf

