什么是pwndbg?
它是gdb
的一个插件,增加了许多功能,来帮助pwn手可以快速寻找到所需要的信息,除了pwndbg
之外还有peda
、gef
等工具可以用来协助进行调试。
如何给pwndbg分屏?
1 2
| vim ~/.gdbinit set context-output /dev/pts/2 # 这里修改成2,那么就会在第二个终端显示信息
|
pwndbg的基础操作:
启动调试:
如果我们已经成功安装了pwndbg
,那么打开gdb
之后会显示pwndbg>
这样的提示符号,否则是gdb>
基础操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
| ************************************************** pwndbg> start # 开始运行,会停留在start函数上(start函数是main函数之前的一个函数) ************************************************** pwndbg> q # 退出调试 ************************************************** pwndbg> r # 从头运行程序直到遇到断点,没有断点则会一直运行到结束 ************************************************** pwndbg> c # 继续执行程序直到遇到断点,没有断点则会一直运行到结束 ************************************************** pwndbg> n # 单步步过,n不会进入一个小函数 ************************************************** pwndbg> ni # 常用,同n,但是是汇编层面的一步 ************************************************** pwndbg> s # 步入,比如遇到一个call 什么什么函数,s会进入看看怎么个事 ************************************************** pwndbg> si # 常用,同s,但是是汇编层面的一步 ************************************************** pwndbg> fini # 快速运行结束当前函数 ************************************************** pwndbg> context # 重新打印页面信息 ************************************************** pwndbg> b function_name # 比如: b read 在read函数上下断点,运行到read函数的时候就会停止 ************************************************** pwndbg> b *(&function_name+offset) # 比如: b *(&read + 10) 在read函数+10的地址上下断点,运行到这个地址的时候就会停止 ************************************************** pwndbg> b *0xaddr # 比如: b *0x408010 那么程序运行到0x408010这个地址的时候就会停止 ************************************************** pwndbg> i b # 查看断点信息,哪些地方打了断点 ************************************************** pwndbg> delete <断点序号> # 删除断点序号对应的断点,单独一个delete会删除所有断点 ************************************************** pwndbg> i r # 查看所有寄存器中存储的数据 ************************************************** pwndbg> i r <registers> # 查看具体某一个寄存器的值 比如: pwndbg> i r rax ************************************************** pwndbg> stack <int> # 查看栈中的信息,具体数量填在stack后面,比如: stack 50 ************************************************** pwndbg> search <string> # 在程序中查看字符串,可以查看自己输入的信息被存在什么地方了 ************************************************** pwndbg> set $<rigister> = <int> # 使用set来给寄存器设置自定义的值 ************************************************** pwndbg> bt # 查看我们当前这个函数的上一个函数是什么 ************************************************** pwndbg> vmmap # 查看程序各个段的位置以及权限等信息 ************************************************** pwndbg> elf # 查看elf文件信息 ************************************************** pwndbg> bins # 查看释放的堆块 ************************************************** pwndbg> heap # 查看正在使用的堆块 **************************************************
|
x命令和p命令的使用:
1. x
命令
x
命令用于查看内存中的数据。它可以显示指定地址或变量所占内存的内容。其基本语法如下:
参数说明:
n
:可选,表示要显示的单元数量,默认为1。
f
:可选,表示显示的格式,常见格式包括:
d
:十进制整数
x
:十六进制
o
:八进制
c
:字符
f
:浮点数
u
:可选,表示数据单位,常见单位包括:
b
:字节
h
:半字(2 字节)
w
:字(4 字节)
g
:巨字(8 字节)
示例:
查看内存地址的内容:
以上命令将以十六进制格式显示从 0x7fffffffe000
开始的10个字节的内容。
查看变量的内容:
该命令将以十进制格式查看 my_array
数组的前4个元素。
2. p
命令
p
命令用于打印变量的值,通常用于查看变量的当前状态。其基本语法如下:
参数说明:
示例:
打印简单变量:
该命令将输出 my_variable
的当前值。
打印结构体成员:
此命令将输出结构体 my_struct
中 member
的值。
打印表达式的值:
该命令将输出 my_variable
的值加上10的结果
3. 常见用法示例
3.1 打印变量地址
使用 &
操作符可以打印变量的地址:
3.2 观察数组
结合 p
和 x
命令,可以更好地观察数组内容:
1
| x/10d my_array p my_array[0]
|
3.3 打印指针指向的值
如果打印指针指向的内容,可以使用 *
:
在 gdb
中是可以设置地址随机化开关,需要的时候可以关闭,来帮助我们调试
1 2 3
| pwndbg> set disable-randomization on # 开 pwndbg> set disable-randomization off # 关 pwndbg> show disable-randomization # 查
|
参考文献:
gdb调试入门指北 - ve1kcon - 博客园 (cnblogs.com)
pwn技术分享——pwndbg分屏显示设置_哔哩哔哩_bilibili