[Hack翻译]使用Cutter进行逆向工程

3,129 阅读4分钟

本文由 简悦SimpRead 转码,原文地址 geekpradd.github.io

在上一篇教程中,我们通过使用IDA观察t......,研究了使用汇编进行逆向工程。

在上一篇教程中,我们通过使用IDA观察可执行文件的汇编代码,研究了使用汇编进行逆向工程的问题。理解汇编是非常有用的,可以让人了解程序的内部是如何工作的。然而,有时仅用汇编来计算和反转程序的逻辑会变得非常困难,特别是当程序很复杂时。

幸运的是,另一类被称为反编译器的程序使我们能够从生成的汇编中获得伪代码,并使用它来反转程序。当然,这个代码不会是完美的,在大多数情况下它不会运行。但是分析这个伪代码要比使用汇编容易得多,我们将看到我们如何使用它来解决问题。

我们将使用由国家安全局编写的ghidra反编译器(它是开源的,所以你不必担心安全风险)。ghidra是一个完整的反转工具包,非常强大,但它使用起来可能有点不友好。我们将使用基于radare2平台的cutter,它使用ghidra进行反编译。

安装 Cutter

你首先要安装radare2,它提供了很多通过终端进行反汇编和反转的工具。

按照这个链接来获取你的平台的二进制安装程序。

一旦完成,你可以简单地从这里下载切割器appimage。

可以简单地双击appimage文件来运行cutter。但你必须将其设置为允许的可执行文件。你可以通过简单地运行以下命令来做到这一点。

chmod +x Cutter-v1.10.3-x64.Linux.AppImage

现在双击appimage来运行Cutter。

使用Cutter和Ghidra解决一个破解程序

我们将用这个crackme演示如何使用Cutter。

Crackmes.one有很多你需要破解的文件,这个是一个相对简单的文件。它叫做ZED-Frequency。让我们试着运行它(记住你可能需要chmod+x,这样这个可执行文件才能运行。)

看起来你需要传递一个密钥文件。让我们创建一个文本为 "CSEAIITB "的简单文件,并把它作为一个密钥文件传递。

因此,一个特定的密钥是由这个文本生成的。我们需要弄清楚正确的密钥和产生这个密钥的原因。这就是挑战。让我们在cutter中加载这个文件。

打开cutter,加载这个文件。继续点击OK,我们要使用默认设置。你在这里结束了。

首先让我们启用反编译器。在菜单栏上进入Windows,点击反编译器。你应该在底部看到反编译器了。它将加载entry0的反编译代码。然而,我们想研究main函数,所以双击左边的main

这就是Ghidra给我们的代码。它可能看起来很复杂,但让我们分析一下。首先观察一下,这里有很多十六进制代码在飞舞。那些只是被传递的内存位置(认为是指针值)。如果你点击底部的字符串,你会发现这些指针所指向的值。

总之,如果你观察一下,似乎uVar2正在存储来自命令行argv的文件数据。另外在最后你会看到如果iVar1==0(当s1等于0xb16处的字符串时,会发生一些事情。让我们到字符串中去看看。

所以如果s1等于01234567890123456789012345我们就成功了。这就是关键所在。

但我们如何得到这个呢?如果你看一下源代码,你会发现s1基本上是数组a1Stack168中数据的字符串形式,索引从026发生。

这个数组是如何获得这些值的呢?观察主while循环。似乎值的更新是通过考虑输入文件中的每一个字符并更新一些值。0x41的值出现了很多次,它是A的ASCII码。

我将让你看到,这个编码除了计算从AZ的每个字符的出现次数外,什么都没做。因此,在钥匙的第一个位置上出现0意味着没有A,以此类推。

然后我们就可以很容易地生成密钥了

下面的python代码生成了密钥。

f = open("key.txt", "w")
final_key = ""

for _ in range(26):
	final_key += chr(65+_)*(_%10)

f.write(final_key)
f.close()

现在,如果我们把这个键传给程序,我们会看到以下输出。

这就是这个破解方法的总结。这是一个相当简单的例子,使用反编译器使其变得非常简单。这个工具对于复杂的ctf问题是非常有用的,在这种情况下,有一个代码可以回溯,同时看一下汇编是非常有用的。