Buuctf中的XOR

0x00 前言

        最近突然忙起来了,忙里偷闲的做道题。

0x01 复习

        首先要复习一下布尔运算的一些知识。

        布尔运算符有“&,|,-,⊕”,分别对应“与、或、非、异或”。其中的运算规则为:

与:

0&0 = 0,0&1 = 0,1&0 = 0,1&1 = 1;

或:

0|0 = 0,0|1 = 1,1|0 = 1,1|1 = 1;


非:

0 = 1,1 = 0

异或:

0⊕0 = 0,0⊕1 = 1,1⊕0 = 1,1⊕1 = 0

        好,复习完毕,看题。

0x02 XOR题目

        写到这里突然想起来,我还没交Flag,请稍等一下。

        好的,那么直接进入正题。

        下载到文件之后先解压,把文件丢进PE里看看有没有壳。

        在PE中能够得到的信息有:不是EXE文件,在MacOS环境运行,64位,未加壳。因此,直接把该文件丢进IDA64位中进一步分析。

        进入IDA之后要做什么呢?当然是找Main函数喽。 在上图中可以看到比较显眼的“Input your flag”,继续追踪看看。

        上图中有“Success”和“Failed”,那么问题来了,在什么样的情况下能触发“Success”?再往上看就能够找到,当然,我依然是不建议直接用F5看代码的,因为高级语言编写的代码最终会转成汇编语言,最后转成二进制被CPU执行。诚然,作为“猿”,了解计算机越多,得到的乐趣也就越多。(更专业!更专业!)

        继续看代码,里面有mov等指令,这里大概分析一下:

mov 把21移动到eax寄存器中,h代表16进制。

lea 加载内存地址到寄存器中。

call 调用指令。

cmp 比较指令。

jnz 跳转到指定地址。

; 汇编语言的注释符。

         因此,达成Success逻辑是:比较“__s1”与“__s2”的值,如果相等则输出“Success”。那么条件已经明确了,找到s2是什么,这道题的Flag就出来了。接下来追踪一下“__s2”,双击_global。

         追踪下来发现一串神奇的字符串,接下来用IDA的shift+E输出,将其转换成为16进行的C语言。

用Python写一个脚本。

        写一个小循环,其中,chr() 函数是用一个范围在 range(256)内的(就是0~255)整数作参数,返回一个对应的字符。当i遍历完之后,答案就出来啦——flag{QianQiuWanDai_YiTongJiangHu}。

0x03 总结

        其实好久没做题,有点生疏了,找找借口就是工作忙。但是摸着良心讲,这道题之前看大佬的攻略做出来过,不过那个时候不太理解写出来的脚本。随着做题多了,有些之前不理解的地方也懂了,编程能力有些许提高。

        以前认为编程又难又枯燥,就很抗拒,但是接触到逆向之后才发现原来逆向的基础是编程,慢慢的也在编程中找到了乐趣。因此,在解题过程中,我也没有一上来就在IDA中按F12找关键字,也没有按F5直接看伪代码。了解计算机的师傅都清楚,高级语言最后会转变成低级语言,然后转成二进制,才能被计算机识别。所以,想在逆向路上走的更远,打好基础才是关键,要掌握一些编程语言,比如:C,C++,汇编,Python等等。就好像,变成超级赛亚人战斗力会翻倍,但是想要超越超级赛亚人的前提是提升本体的战斗力。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值