译文声明
本文是翻译文章,文章原作者Itay Cohen,文章来源:https://www.megabeets.net
原文地址:https://www.megabeets.net/5-ways-to-patch-binaries-with-cutter/#Getting_to_know_our_target
前言
我最近看了LiveOverflow的视频,他在视频中展示了如何使用不同的工具patch二进制文件。这些工具包括Radare2、Ghidra和Binary Ninja。虽然工具种类繁多,但是我对Cutter情有独钟。 尽管它是工具包中最年轻的成员,但是Cutter成长迅速。
“Binary Patching”是指对二进制文件进行小的更改或修改,通常是为了改变执行流程。通过修改数据或代码,用户可以更改程序或特定指令中的某些值,将二进制代码调整为他们期望的效果。
了解我们的目标
在本文中,我们仍使用与LiveOverflow视频中相同二进制文件-license_1.c。
为了方便操作,我把源代码粘贴在下面。
```language
include
include
int main(int argc, char *argv[]) {
if(argc==2) {
printf("Checking License: %sn", argv[1]);
if(strcmp(argv[1], "AAAA-Z10N-42-OK")==0) {
printf("Access Granted!n");
} else {
printf("WRONG!n");
}
} else {
printf("Usage: n");
}
return 0;
}
代码逻辑非常简单,接收用户的输入。然后将其与硬编码密钥“ AAAA-Z10N-42-OK”进行比较。如果密钥匹配,程序将显示“ Access Granted!”。否则,输出 “WRONG!”
language
$ license_1 test_key
Checking License: test_key
WRONG!
我们期待patch的最终效果是,即使输入错误的密钥,也可以输出正确的提示。
language
在进行patch之前,我喜欢先备份一下文件。
$ cp license_1 license_1.backup
```
打开Cutter,然后选择载入license_1,在下一个对话框中选择“Load in write mode (-w)”,然后保持其它设置不变即可,最后单击’OK’
您可以在侧面函数列表中选中’main’函数,或者在界面顶部的导航框中键入“ main”。这个程序的main()函数非常小,几乎包含了程序的所有逻辑。
main()函数只有6个代码块,我们很容易就找到了需要进行patch的地方。事实上,我们只需注意带有strcmp比较的块即可。具体的修补方法在下文中会详细介绍。
方法1:反向跳转
最简单,也是最直观的方法是右键单击“ jne”指令,然后选择“Edit -> Reverse jump”.。
Cutter很智能,它可以自动把’jne’指令修改为控制转移条件相反的指令(’je’)。
我们所做的更改会自动添加到二进制文件中。为了测试修改的有效性,我们可以对其进行简单的测试:
language
$ license_1 test_key
Checking License: test_key
Access Granted!
这种修补方式很容易。让我们看看其他方法。
方法2:直接通过反汇编器
如果您下载了官方版本的Cutter,那么它应该已经集成了Ghidra反编译器。它的本地实现称为r2ghidra-dec。如果您是自己构建的Cutter,则还需手动构建r2ghidra-dec。按照链接中的提示进行操作即可。
从“Windows->decompiler”打开“decompiler”窗口并搜索“main”函数。然后选中if(iVar1==0){,右键 “Edit > Reverse jump”。
这显示了在Cutter中使用反编译器的强大功能。
方法3:NOP填充
这是另一种跳过检查并跳转成功的一种方法。只需在反汇编窗口中右键单击,选择“Edit -> Nop Instruction”。
修改前:
language
0x00400602 call sym.imp.strcmp ; int strcmp(const char *s1, const char *s2)
0x00400607 test eax, eax
0x00400609 jne 0x400617
0x0040060b mov edi, str.Access_Granted
修改后:
language
0x00400602 call sym.imp.strcmp ; int strcmp(const char *s1, const char *s2)
0x00400607 test eax, eax
0x00400609 nop
0x0040060a nop
0x0040060b mov edi, str.Access_Granted
方法4:反汇编指令
我们还可以手动把'jne'更改为je。单击右键,选择“Edit -> Instruction”。然后将“ jne 0x400617”更改为“ je 0x400617”即可。Cutter会自动获取指令的机器码。
方法5:汇编字节
如果你厌倦了汇编指令,想通过字节修补的方式进行’patch’。只需选中“Edit -> Bytes”,然后把750c更改为740c(从jne更改为je)。Cutter同样提供指令预览。
番外:使用radare2控制台
如果您熟悉radare2,Cutter同样集成了radare2的控制台。点击“Windows -> Console”就可以打开控制台,键入您想要的r2命令。您可以使用wx,wa等命令对字节进行修补。要了解更多用法,输入w?
结语
在这篇文章中,我们使用Cutter,并通过5种实现了对二进制文件的patch。当然还有其他的方法对二进制文件进行修补,如在Cutter使用hex编辑器,但是这五种方法足以应对大多数情况。
PS:第一次接触patch,是在全国大学生信息安全竞赛创新实践能力赛中。在无源码的情况下对二进制文件进行patch。当时使用的便是Cutter,IDA也有对应的插件keypatch,萝卜青菜各有所爱。挑选一个自己觉得用的舒服的工具即可。
0x00 前言 在实际渗透中,我们用到最多的就是Potato家族的提权。本文着重研究Potato家族的提权原理以及本地提权细节 0x01 原理讲解 1.利用Potato提权的是前提是拥有SeImpersonatePrivilege或SeAssignPrimar…
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论