Gdb Pwndbg cheatsheet
gdb#
所有命令都可以简写为前一个或几个字母,如果没有冲突的话
信息类#
info share # 查看动态库
info proc map # 查看 mapping 信息
info locals # 查看局部变量
info args # 查看参数
info types node # 查看所有类型,并过滤“node”
search "abc" # 搜索字符串
x/20i 0x42E5AA # 查看 20 行汇编
print var # 打印变量值
print *array@len # 打印数组 array 的前 len 个值
list 10,20 # 打印 10~20 行源码
list my_function # 打印函数
list filename:linenumber # 打印文件对应源码
dump memory dump.bin 0x00007ffff7ff8000 0x00007ffff7ffd000 # dump 内存
更好看的结构体#
# 默认
$ p (struct node_t)n1
$22 = {key = 0x24, left_node = 4214976, right_node = 4215008}
# 好看
set print pretty on
$ p (struct node_t)n1
$21 = {
key = 0x24,
left_node = 4214976,
right_node = 4215008
}
断点类#
catch load # 断点在动态库加载
catch syscall # 断点所有系统调用
catch syscall write # 断点 write 调用
info b # 查看所有断点信息
delete 2 # 删除断点2
watch *0x48354c # 写入
rwatch *0x48354c # 读取
awatch *0x48354c # 读写
watch i == 2 # 条件断点
tb # tbreak, tempbreak,临时断点
运行类#
n[ext] # step-over
s[tep] # step-into
上面俩加上[i]就是汇编指令级别的单步
set follow-fork-mode child/parent # 设置 fork 之后,调试的是 child 还是 parent
start # 从 main 或者 _start 开始
run < stdin.txt # 改变标准输入流,也可以 start < stdin.txt
反向调试#
> start
> record
> reverse-stepi # 或者其他的 reverse- 指令
函数、变量#
define ww
set $temp = $rsi
end
define cdd
continue
x/396xb $temp
end
watch *$temp + 0x18c
pwndbg 专用#
context # 重新打印出仪表盘
vmmap
断点+函数#
先断点
b func4
然后马上输入 commands
或者 commands <断点标号>