本文由 简悦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
中数据的字符串方式,索引从0
到26
产生。
这个数组是怎么取得这些值的呢?调查主while循环。好像值的更新是经过考虑输入文件中的每一个字符并更新一些值。0x41
的值呈现了很多次,它是A
的ASCII码。
我将让你看到,这个编码除了计算从A
到Z
的每个字符的呈现次数外,什么都没做。因而,在钥匙的第一个位置上呈现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问题对错常有用的,在这种情况下,有一个代码能够回溯,一起看一下汇编对错常有用的。