【GWCTF 2019】xxor

下载后是个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!}

好了今天的思修笔记还没写,已经十点多了应该来得及。

发表了74篇文章 · 总计107.96k字
本博客已稳定运行
使用 Hugo 构建
主题 StackJimmy 设计