汇编语言学习3---GDB调试
Break
尝试在_start设置断点
然后使用 run 或者 r 运行
可以看见我们在0x401000暂停,如果想要在其他地址添加断点可以使用,比如:
b *0x40100a
Examine
如果我们想手动检查任何地址或寄存器,或检查其他任何内容,可以使用 x 命令,格式为 x/FMT ADDRESS
检查格式 FMT
可以有三个部分:
参数 | 描述 | 示例 |
---|---|---|
Count | 要重复检查的次数 | 2, 3, 10 |
Format | 结果呈现的格式 | x(十六进制),s(字符串),i(指令) |
Size | 要检查的内存大小 | b(字节),h(半字),w(字),g(巨型,8字节) |
比如,检查$rip寄存器
x/4ig $rip
- 4:表示我们要查看的指令数,这里是 4 条。
- i:表示我们想查看的内容是“指令”(instruction)。
- g:表示查看的内存大小是“巨型”格式,通常是 8 字节或 64 位。
Step
使用 stepi (si) 命令逐条执行汇编指令
si
也可以执行多个指令,如果你想执行 2条指令
si 2
step 命令会继续执行直到当前函数结束,或者执行到下一行代码。
next
stepi (si):逐条执行汇编指令,每次执行一条指令。
step (s):继续执行直到当前函数结束,进入函数时会停在函数开始处。
next (n):执行当前行直到结束,但跳过函数调用。
Modify
修改寄存器和内存地址中的值,并观察这些修改如何影响程序的执行。
我们可以使用 set
命令来修改寄存器的值,或者直接使用 GEF 提供的 patch
命令来修改内存地址中的数据:
使用 patch
命令
gef➤ help patch
patch
命令允许我们在指定的地址写入指定的值,格式如下:
patch (qword|dword|word|byte) LOCATION VALUES
patch string LOCATION "double-escaped string"
- 类型/大小:指定我们要修改的数据类型(如
qword
,dword
,word
,byte
)。 - 位置:指定我们要修改的内存地址。
- 值:指定要写入的值。
例如,如果我们想修改 .data
段(我们之前看到它的地址为 0x402000
)中存储的字符串,可以使用 patch
命令,加上要修改 rdx
寄存器的值,将其设置为字符串的长度(0x9
),可以使用 set
命令:
gef➤ break *0x401019 # 在地址 0x401019 设置断点
Breakpoint 1 at 0x401019
gef➤ r # 运行程序
gef➤ patch string 0x402000 "Evil!\\x0a" # 修改字符串
gef➤ set $rdx=0x9 # 修改 rdx 寄存器的值为字符串长度 0x9
gef➤ c # 继续执行