gdb的调试与使用

少部分包含gdb-peda的特性。。

gdb-peda

1. 调试的快捷键

peda带有的功能,直接输入命令,其就会给予提示(如果不是这样,基本上也是该命令就可以不带参数)。这儿就不多做介绍

1.1 基础的调试快捷键

  • s step,si步入
  • n 执行下一条指令 ni步入
  • b 在某处下断点,可以用
    • b * adrress
    • b function_name
    • info b 查看断点信息
    • delete 1删除第一个断点
  • c 继续
  • r 执行
  • disas addr 查看addr处前后的反汇编代码

1.2 显示数据

  • p 系列
    • p system/main 显示某个函数地址
      • p $esp 显示寄存器
    • p/x p/a p/b p/s。。。
    • p 0xff - 0xea 计算器
    • print &VarName 查看变量地址
    • p * 0xffffebac 查看某个地址处的值
  • x系列
    • x/xw addr 显示某个地址处开始的16进制内容,如果有符号表会加载符号表
    • x/x $esp 查看esp寄存器中的值
    • x/s addr 查看addr处的字符串
    • x/b addr 查看addr处的字符
    • x/i addr 查看addr处的反汇编结果
    • x/ngx addr 显示某个地址处开始的十六进制内容,以八字节位单位显示n个
  • info系列
    • info register $ebp 查看寄存器ebp中的内容 (简写为 i r ebp)
    • i r eflags 查看状态寄存器
    • i r ss 查看段寄存器
    • i b 查看断点信息
    • i functions 查看所有的函数
  • disas addr 查看addr处前后的反汇编代码
  • stack 20 查看栈内20个值
  • show args 查看参数
  • vmmap 查看映射状况 peda带有
  • readelf 查看elf文件中各个段的起始地址 peda带有
  • parseheap 显示堆状况 peda带有

1.3 查找数据

  • find 查找字符串 peda带有
  • searchmem 查找字符串 peda带有

1.4 修改数据

  • set $esp=0x110 修改寄存器的值
  • set *0xf7ff3234=0x08042334 修改内存的值
  • set args "asdasg" "afdasgasg" "agasdsa" 分别给参数1,2,3赋值
  • set args “python -c 'print "1234\x7f\xde"'“ 这个参数中用python脚本重写了一下,避免有些字符无法正确设置
  • r "arg1" "arg2" "arg3"设置参数

2. 查找某个plt、got、plt_2

  • plt 可以直接使用pwntools中的ELF(elf).symbols(function_name)
  • got 可以直接使用pwntools中的ELF(elf).got(function_name)
  • plt_2 可以直接使用pwntools中的ELF(lib).symbols(function_name)

3. 查找程序所动态链接的库

  • file pwn3

    • pwn3: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.24, BuildID[sha1]=916959406d0c545f6971223c8e06bff1ed9ae74d, not stripped
  • checksec pwn3

    • [*] ‘/root/Desktop/Pwnable/fmt/normal/fmt_string_write_got/pwn3’
      Arch: i386-32-little
      RELRO: Partial RELRO
      Stack: No canary found
      NX: NX enabled
      PIE: No PIE (0x8048000)
  • ldd pwn3

    • linux-gate.so.1 (0xf77ad000)
      libc.so.6 => /lib32/libc.so.6 (0xf75d2000)
      /lib/ld-linux.so.2 (0x56601000)

4.堆操作

  • tracemalloc on跟踪每次malloc

  • parseheap 把堆的布局输出

  • heapinfo展示heap的信息

5.开启和关闭ALSR

ASLR 的等级可以通过一个内核参数 randomize_va_space 来进行控制,查看其值即可知道当前系统的 ASLR 的等级,如下:

  • 0:关闭ASLR
1
sudo bash -c "echo 0 > /proc/sys/kernel/randomize_va_space"
  • 1:保留的ASLR
1
sudo bash -c "echo 1 > /proc/sys/kernel/randomize_va_space"
  • 2:完全的ASLR
1
sudo bash -c "echo 2 > /proc/sys/kernel/randomize_va_space"
-------------本文结束感谢您的阅读-------------
+ +