在本文中,我们将处理在Ghidra中反编译MIPS二进制文件,并逆转IDA中用golang编写的程序。
第1部分-C,C ++和DotNet反编译。组织信息特别是对于那些想要学习新知识并在信息和计算机安全性的任何领域中发展的人们,我将撰写和讨论以下类别:
- PWN;
- 密码学(加密);
- 网络技术(网络);
- 反向(反向工程);
- 隐写术(Stegano);
- 搜索和利用Web漏洞。
除此之外,我将分享我在计算机取证,恶意软件和固件分析,对无线网络和局域网的攻击,进行笔测试和编写漏洞利用程序方面的经验。
为了使您可以查找有关新文章,软件和其他信息的信息,我
在Telegram中创建了一个
频道,并创建了一个
小组来讨论 ICD领域中的
所有问题 。 另外,我会亲自考虑您的个人要求,问题,建议和建议,
并会回答所有人 。
提供所有信息仅出于教育目的。 对于由于使用本文档而获得的知识和方法对某人造成的任何损害,本文档的作者不承担任何责任。
ELF MIPS

下载并检查文件。

这是MIPS体系结构处理器的32位可执行文件。 为了解决这个问题,我们将使用Ghidra。 打开hydra,创建一个新项目并将其添加到我们的可执行文件中。

现在打开调查的文件,然后移至“符号树”窗口。 在搜索中,键入main以找到程序的入口点。

选择函数后,它将立即在反编译器中打开。

让我们转换代码。

我们看到将64个字节读取到local_54变量中,让我们将其重命名为输入(热键L),并创建一个64个字符的char数组(热键Ctrl + L)。 您还可以重命名变量sVar1。


进行一些转换之后,代码看起来更漂亮了。

我们分析代码。 我们输入的字符串必须为19个字符长。 应从代码中清楚看出哪个字符。 在这种情况下,从8号到17号应为符号“ i”。 我们恢复,通过密码。
Golang基本

在此作业中,我们提供了用Go编写的可执行文件。 您甚至可以找出哪个版本。 我扔了IDA。 应该马上说main函数不是main,而是main_main。 因此,我们按功能执行搜索,然后转到真正的主搜索。

让我们来分析代码。 让我们从头开始。

有一个键输入的定义。 左边的块负责完成main_main函数。 考虑左边的方块。

fmt_Scanln函数旨在从控制台读取一行。 我们还观察了已经保存在程序中的main_statictmp_2数据。

接下来,调用runtime_stringtoslicebyte函数,根据代码,我们可以假定它占用了下一行的前6个字节。

Key.ptr将指向此切片的开头。 让我们看看接下来会发生什么。

取决于无效寄存器r9和寄存器rsi的比较,用户输入的长度位于该位置。 由此我们可以得出结论,r9很可能是一个计数器。 让我们看一下在我们输入的行中出售之后控件将要移到的右侧块。

调用bytes_Compare函数,该函数根据比较结果显示其中一行。


我们找出了程序的输出,现在让我们看一下换行符(在左分支上)。

来自用户输入的字符被输入到r10寄存器中,然后有一堆复杂的代码用于比较以控制异常(例如恐慌除法和恐慌索引)。 我突出显示了程序执行分支。

因此,将来自静态指定字符串的字节放入EDX中,并与r10争吵,其中r是切片中的字节。 接下来,计数器r9增加。 最有可能需要两个中间相邻的块来控制切割的长度。
让我们将所有内容组合在一起:输入的行被切片污染,并与静态指定的行进行比较。 让我们代理以查找正确的密码。

我们得到答案。 Go二进制文件的反向操作的复杂性在于存在复杂的因素,例如行尾没有空字符,其类型的表示形式,垃圾收集器等。
现在就这些了。 待续...您可以加入
Telegram 。 在这里,您可以提出自己的主题,并为以下文章的主题选择投票。