前言

简介

GDB 堪称陆地最强调试器

  • gdb是GNU开源组织发布的一个强大的Linux下的程序调试工具
  • gdb除支持c/c++语言外还支持go、D、object-c、fortran等语言
  • GDB主要帮助你完成下面四个方面的功能:
    • 启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
    • 可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
    • 当程序被停住时,可以检查此时你的程序中所发生的事。
    • 你可以改变你的程序,将一个BUG产生的影响修正从而测试其他BUG

命令

步过 步入 步出
一行行往下走,无论是否有函数,直接进入下一行代码 无函数,直接进行下一行代码,相当于步过
有函数则进入函数第一行代码
直接将现在所在的函数执行完,并跳出该函数
  • rip是64位

    eip是32位

    编译指令

  • gcc 文件.c -o 文件_x64 (将源文件编译成x64位系统)

    gcc hello.c -o hello_x64

  • gcc -m32 文件.c -o 文件_x86 (将源文件编译成x86系统下的32位文件)

    gcc -m32 hello.c -o hello_x86

  • gcc -m32 文件.c -fomit-frame-pointer -o 文件_x86_esp

    gcc -m32 hello.c -fomit-frame-pointer -o hello_x86_esp

  • gcc 文件.c -fomit-frame-pointer -o 文件_x64_esp

    gcc hello.c -fomit-frame-pointer -o hello_x64_esp

  • gcc -s 文件.c

    gcc -s hello.c

  • gcc 文件.c -no-pie -o 文件_x64_nopie (去掉pie)

    gcc hello.c -no-pie -o hello_x64_nopie

  • gcc 文件.c -static -o 文件_x64_static (静态链接编译)

    gcc hello.c -static -o hello_x64_static

  • gdb ./文件_x64(x86) (gdb开始调试)

    gdb ./hello_x64

      • objdump -d 文件 -M intel |less

        (相当于ida,在shell里进行反编译)

基础调试指令

  • start

    程序运行到入口点,gdb定义的入口点

  • r

    如果此前没有断点,则运行完程序,如果有断点,则暂停到第一个可用断点处

  • i

    查看信息

    • i r

    查看寄存器

    • i b

      查看断点

  • c
    执行到遇到断点为止或者程序结束

  • b
    设置断点

    1. b加<函数名称>(b main)

    2. b加<行号>(b numble)

    3. b加*<代码地址>(b *0x18)

  • finish(步出)

    结束函数,从函数里直接出来

  • d 数字
    删除断点

  • set

    改变变量值

    1. set *0x地址=数值(给地址赋值) set *0x8888=62
    2. set $寄存器=数值(给寄存器赋值) set $rip=62
    3. set *((unsigned int)$ebp..)=0x18
  • vmmap

    程序中关键地址段

  • list

    显示源文件

  • file

    看具体细节

    (文件格式,大小端序,位数,,,)

  • ldd

    对细节的描述更清楚

  • p

    p &函数 ( p &main)

    打印出函数的地址

    p/x &数组p/x &heaparray

    打印数组地址

  • search

    search '字符'

    {搜索某个字符所在的地址}

  • cyclic 数字

    cyclic 100

    自动生成100个字符

    cyclic -l 一串ASCII

    可以计算出这串ASCII所在偏移量


反编译指令

  1. disassemble
    查看当前函数的反汇编

  2. disassemble 函数名字
    查看这个函数的反汇编

  3. disassemble 地址
    地址附近函数的反汇编

  4. disassemble 地址1,地址2
    查看地址1到地址2范围内的反汇编

  5. disassemble $rip
    反编译rip现在所直到的函数位置


x/数字i $rip

从rip开始反汇编(数字)行

x/20i $rip (从rip开始反汇编20行)

x/20 i 0x12345678 (从0x12345678开始反汇编20行)

i d * x s * b w * g *
汇编 10进制 16进制 字符 一个字节 8个字节 4个字节

s si n ni
步入 步过
单步进入
执行一行源程序代码,有函数调用,则进入函数
单步跟踪
执行一行源程序代码,有函数调用则直接将函数执行完,不进入函数
针对源代码 针对汇编指令,与s等同 针对源代码 针对汇编指令,与n等同

disable b 数字 enable b 数字
让断点失效 让断点生效

调试过程

编译

  • gcc 文件.c -o 文件_x64 (将源文件编译成x64位系统)

    gcc hello.c -o hello_x64

  • gcc -m32 文件.c -o 文件_x86 (将源文件编译成x86系统下的32位文件)

    gcc -m32 hello.c -o hello_x86

  • gcc -m64 文件.c -o 文件_x86(将源文件编译成x86系统下的64位文件)

    gcc -m64 hello.c -0 hello_x86

屏幕截图 2023-12-03 205910

运行

  • ./文件_x86(x64)

    ./hello_x86

屏幕截图 2023-12-03 213257

看具体细节

  • 查看文件的少部分内容

    file 文件_x86(x64)

    file hello_x86

屏幕截图 2023-12-03 213940

  • 查看ELF文件

    readelf -a 文件_x86(x64)

    readelf -a hello_x86

屏幕截图 2023-12-03 214027

屏幕截图 2023-12-03 214048

  • 查看更详细的内容 ***very important

    ldd 文件_x86(x64)

    ldd hello_x86

屏幕截图 2023-12-03 215108

  • 开始gdb调试

    gdb 文件_x86(x64)

    gdb hello_x86

屏幕截图 2023-12-03 223940

  • 先r一下,检查是否有错误

屏幕截图 2023-12-03 224013

  • 再start一下,看一下入口以来设置断点

屏幕截图 2023-12-03 224112

  • start之后必须要设置断点,不然任何命令都不起作用

    b设置断点

    i b检查断点

屏幕截图 2023-12-03 224321

然后就可以开始正式调试了!!!