下载后是个elf文件,直接扔进IDA分析:
Main的代码也比较简单:
根据提示,我们需要输入六个数据,在经过两处处理之后得到一段数据,最后将其转换为十六进制在转成字符串。
第一部分处理:
这里是将输入的六个数据第一次处理,三次循环,每次取两个数据出来存到dword_601078和dword_60107C中。
sub_400686对每次取出的第一个数据进行再处理,byte_601060里面存放的是四个数据:2,2,3,4。
我们进去sub_400686函数内部:
需要注意的地方是,a3取到了a1[0],a4取到了a1[1],其实就是在外面循环中每次取入的两个数据。
在函数内部经过六十四次运算之后,将得到的结果存入a1[0]和a1[1],返回外面的循环。
在之后便是把这两个处理过的数据放进v11数组中。这个地方的第二个数据其实已经发生了变化,地址存放的数据已经改变了。
第二个处理便是:
这里需要进入sub_400770内部查看:
这里比较简单了,用计算器算一下这六个数,这六个数就是上面一层数据处理之后应该得到的结果。
那么需要我们逆向的就是通过这六个数反推我们应该输入的六个数,大体流程比较简单(不会贴代码只好放图):
我在写程序的时候发现对数据定义的不同会造成不同的结果。比如我对数组a[6]定义成unsigned int 和long int就完全不一样。
之前学C的时候没怎么注意过数据范围,搞算法竞赛的时候也只是随手丢一个long long,为什么会出现差别呢?我觉得其中的细节值得深究一下。
跑出来的结果:
666c61677b72655f69735f6772656174217d
用在线网站转化一下:
flag{re_is_great!}
好了今天的思修笔记还没写,已经十点多了应该来得及。