调试已编译的程序是学习x86汇编语言。使用汇编程序时,单步执行代码中编写的每一条指令的唯一方法是使用调试器来调试程序。
GDB是用于调试基于Linux的可执行程序的最流行的调试器之一。GDB也广泛用于开发和逆向工程。本文着重于理解如何使用GDB来单步执行给定x86汇编程序的指令。
目标可执行文件
在本文的后面部分,将向读者介绍如何使用GDB
。因此,我们将准备一个用x86汇编
编写的简单二进制文件,这样我们就可以使用GDB来理解如何使用GDB来调试二进制文件
。以下是我们将使用的程序。
global _start
_start:
mov eax, 8
mov eax, 0xa
mov ebx, eax
mov ecx, [esp]
我们创建了一个名为mov.nasm
的文件,它以一个名为global
的指令开头,它告诉我们的链接器该程序的入口点在哪里。 我们指定这个程序的入口点是_start
。 第一条指令 MOV EAX,8
将值 8
移动到寄存器 EAX
中。
在下一条指令中,我们将 0xa
移动到 EAX
寄存器中。 我们告诉程序我们正在移动一个十进制 10
的十六进制值。接下来,使用MOV EBX, EAX
指令,我们试图将一个寄存器的值移动到另一个寄存器中。 最后,MOV ECX, [ESP]
指令实质上将移动寄存器 ESP
所指向的值。
因此,如果我们指定指令 MOV ECX, [ESP]
,它将尝试选择 ESP
的地址,并将该 ESP 寄存器指向的值移动到 ECX
中。
现在让我们使用 nasm
来组装这个程序。 让我们输入以下命令。
nasm mov.nasm -o mov.o -f elf32
格式为 elf32
,输出文件为 mov.o
。 现在让我们使用 ld
链接它。 这可以使用以下命令来完成。
ld mov.o -o mov -m elf_i386
mov
将成为最终的二进制文件。 我们将对此进行调试。
使用 GDB 和 GEF 进行调试
为了能够检查寄存器和被移动到寄存器中的值,让我们使用 gdb 使用以下命令打开这个程序。
gdb ./mov
它看起来如下:
$ gdb ./mov
GNU gdb (Ubuntu 9.1-0ubuntu1) 9.1
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type “show copying” and “show warranty” for details.
This GDB was configured as “x86_64-linux-gnu”.
Type “show configuration” for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and oth