Logo 逆向知识库

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 <断点标号>