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等等。就好像,变成超级赛亚人战斗力会翻倍,但是想要超越超级赛亚人的前提是提升本体的战斗力。