前言

题目地址:https://buuoj.cn/challenges#[MRCTF2020]Xor

我们为什么要用汇编而不是 F5,因为你迟早会遇到 F5 解决不了的程序,那么你要么加钱升级 IDA,要么老老实实看汇编 —— 武汉科锐逆向

那么我们接下来就来解析一手这个程序的汇编


解析汇编

Untitled

我们很快就可以得到这个代码的流程图,我们首先要找到用户输入的数据存储在什么地方,作为我们的起手点,很快熬,我们可以注意到,这个地方有一个字符串 %s ,熟悉 c 的大概都知道这是用来 scanf 输入一个字符串的格式化占位符。

Untitled

那么很明显了第一个 push 的就是 scanf 的第二个参数(Windows 32 位好像是从右往左将参数 push 进栈的),接下来我们使用重命名功能将这个参数重命名为 user_input

Untitled

然后我们再看结尾,我们需要怎么走才能走到输出 Right 的地方。(很明显输出了 Right 肯定是我们输入了正确的 flag 才行了)

这里要过两个判断,我们先看输出 Right 的那块代码上方的那个判断代码是在干什么。

Untitled

他首先增加了 eax 寄存器,然后和 edx 寄存器比较,如果 eax ≤ edx 就会跳转到 loc_4010D0(跳转回去了)

这个时候作为一个逆向人,你必须要能够看出来这是一个循环代码。其中 eax 是循环变量 i,edx 存储了循环的上限。那么我们来看看 edx 中存储了什么内容。选中 edx 让所有的 edx 数据高亮。

我们可以看到和 edx 相关的代码在这里

Untitled

可以看到这个代码首先不断增加 edx 的值知道 edx 指向的那个字符串为 0,然后退出循环并和起始地址相减再减一,说明这个 edx 是用来获取字符串长度的。最后他还将 edx 和 27 比较,如果不相等直接输出 Wrong。作为一个逆向人应该得一眼看出来这个地方是在获取字符串长度,如果字符串长度不为 27 就直接输出 Wrong。