zoukankan      html  css  js  c++  java
  • 2020/5/18 BUU_ [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!}

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

  • 相关阅读:
    java命名规范:注重细节
    撒旦法撒旦法三阿斯顿发暗室逢灯
    369绿色浏览器开发记录
    时间过得好快
    C++进程间通信(常用理解例子)-买票
    MFC常用 控制对话框透明属性函数
    DedeCms 建站随笔(一)
    个人作业收官——软件工程实践总结
    第三次作业——个人作业——软件产品案例分析
    UML用例图
  • 原文地址:https://www.cnblogs.com/DorinXL/p/12913353.html
Copyright © 2011-2022 走看看