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
,每次启动自动执行
单步执行命令
使用next
和step
逐行执行代码
next # 执行程序的下一行,可缩写为 n
step # 同样执行下一行,不过如果下一行是一个函数,则会进入函数内部,可缩写为 s
finish # 完成该函数的执行,继续执行程序剩余的部分
其中有两个类似的命令nexti
和stepi
,这与上述两个的区别就是,当逐行执行程序下一行是一个函数的时候,不会直接执行,只会执行函数的第一行代码,相当于停止在函数的开始位置