修改正在运行的程序的控制流

逆向工程 调试 数据库
2021-06-16 03:54:29

我正在研究二进制炸弹实验室,我刚刚解除了炸弹我计划通过调试器解决它并开始工作我的动态分析技能或即调试我的真正问题是如何修补或修改 gdb 中的汇编指令?

2个回答

由于已经介绍了 GDB 方法,我将提请注意其他方法,这些方法通常更容易使用其他软件来更改程序。

料斗反汇编器(Linux、OS X)

将光标移动到要修改的指令上,在编辑菜单中选择patch to NOP(即无效指令)或接受x86和ARM指令的“汇编指令”。

在此处输入图片说明

它插入适当的操作代码,并负责任何偏移调整以确保插入不会影响程序的其余部分。然后,您可以运行修改后的程序并进行调试,或生成新的可执行文件(ELF、Macho-O、PE/COFF)。

IDA Pro(Linux、Windows、OS X)

通过编辑idagui.cfg(使用具有提升权限的编辑器)来启用修补菜单

DISPLAY_PATCH_SUBMENU    = YES          // Display the Edit,Patch submenu

使用编辑下的修补菜单插入原始操作代码。注意默认情况下,IDA 只为 IBM PC 自动组装;有关操作码,请参阅 Intel 或 ARM 手册。然后 IDA 可以生成一个新的可执行文件,但通常它可能不起作用,而您需要求助于生成一个.dif.


修补程序

如果你想创建一个补丁程序,我推荐dup2 patcher有了新的可执行文件后,比较新旧的原始十六进制差异,然后指定需要对修补程序创建者进行的更改。(要么替换特定偏移量处的某些内容,要么搜索一组字节并替换它们。)


替代方法

请记住,手动编辑程序的汇编指令并不是改变控制流的唯一方法。相反,您可以使用 DLL 钩子;例如,请参见此处的 InfoSec 文章

您可以使用 set 命令启用写入可执行文件的 .text 部分:

set write on

然后你可以再次使用set命令来设置实际内存

set {int}0xdeadc0de = 0×90909090

但请记住,gdb 没有内置汇编程序,因此您需要提前知道需要修补的字节(通过 nasm 或其他方法)。根据您尝试执行的操作的复杂程度,仅修改必要的寄存器可能会更容易。