gdb调试工具的使用

为了更好的学习pwn,之前学习C语言的时候都是用的visual studo开发环境自带的调试工具进行调试,这里学习一下在linux中使用gdb进行C语言的调试,为后续学习使用pwndbg打下一些基础

安装gdb

kali安装gdb,直接使用apt安装即可

sudo apt install gdb

启动gdb

gdb            # 直接进入gdb
gdb ./a.out    # 启动gdb并加载a.out可执行文件

# 程序需要参数时
gdb --args a.out args

查看源代码

list          # 可缩写为 l

需要注意的是,list查看可执行文件的源代码需要在使用gcc编译可执行代码的时候使用-g参数,例如:

gcc -g hello.c -o hello

断点操作

break main        # 在main函数加入断点,可缩写为 b
b a.out:9         # 在a.out程序中的第九行设置断点
b *内存地址        # 在指定内存地址设置断点

info breakpoints  # 查看断点,可缩写为`i b`

delete 3          # 删除 id 为 3 的断点

continue          # 到达下一个断点

运行程序

run        # 运行程序,缩写为 r
start      # 和run的区别就是,start不需要打断点,默认执行到`main()`函数就会停下

查看变量

ptype a    # 查看a变量的类型
print a    # 查看a变量的值

查看寄存器信息

info registers    # 查看寄存器信息,可缩写为i r

查看汇编代码

disassemble       # 查看反汇编代码
disassemble main   # 进入main函数查看反汇编代码
disassemble $rip    # 进入rip寄存器的内存地址,rip记录者当前代码执行的位置

set disassembly-flavor intel    # 设置反汇编代码为 intel

为了方便,就可以在~/.gdbinit文件加入set disassembly-flavor intel,每次启动自动执行

单步执行命令

使用nextstep逐行执行代码

next      # 执行程序的下一行,可缩写为 n
step      # 同样执行下一行,不过如果下一行是一个函数,则会进入函数内部,可缩写为 s

finish    # 完成该函数的执行,继续执行程序剩余的部分

其中有两个类似的命令nextistepi,这与上述两个的区别就是,当逐行执行程序下一行是一个函数的时候,不会直接执行,只会执行函数的第一行代码,相当于停止在函数的开始位置

posted @ 2023-12-03 14:26  Junglezt  阅读(50)  评论(0编辑  收藏  举报