pwndbg调试

1.b xx

设置断点(b是breakpoint的缩写)

1
2
3
b 函数名        # 在指定函数的起始处设置断点
b *地址
b 行号

2.r

运行的意思(r是run的缩写),一般用来代码开始运行,或者重新运行(如果调试到一半又想从头开始运行)

1
2
3
4
n(不会进入函数内部)
s(会执行到函数内部)
c
start(无断点时)

c:继续执行(c是continue的缩写),当执行r运行到某个断点后,后面想继续执行到下一个断点或者把剩下代码执行完毕,就可以使用c
n:next的意思,执行当前行代码 (当前行是指源程序里的一行代码,就相当于汇编的多条指令)
s:step的意思,当一行代码里有函数调用,那么执行s会跳入函数里执行,如果没有函数调用,那么效果和n相同。看到有想要控制的函数时,就用s,比如ret2text中的vulnerable函数,进入函数内部,再用n运行代码,输入数据调试。

3.info xx

1
2
3
4
5
6
7
8
info b 			#查看断点信息(copy)

info locals #查看局部变量(copy)

info register #查看寄存器(register可以简写为r)
例如:info r ebp #r不能去掉

info functions #查看所有的函数(copy)

4.p xx

p是print的缩写,打印某个变量的值

1
2
3
4
5
6
7
8
9
p system/main 	#显示某个函数地址

$esp  #显示寄存器,$不能去掉

p 0xff - 0xea  #计算器

print &VarName  #查看变量地址

p * 0xffffebac  #查看某个地址处的值

5.x/

可以使用examine命令(简写是x)来查看内存地址中的值。x命令的语法如下所示:

n、f、u是可选的参数。

n 是一个正整数,表示显示内存的长度。也就是说从当前地址向后显示几个地址的内容。

f 表示显示的格式。如果地址所指的是字符串,那么格式可以是s,如果是指令地址,那么格式可以是i。
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十六进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
c 按字符格式显示变量。
f 按浮点数格式显示变量。

u表示从当前地址往后请求的字节数。如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字节,g表示八字节。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。

1
x/10xb &len 从len的首地址开始,显示首地址后面10个地址,以16进制的形式,打印4个字节

来个具体的例子:想看以地址0x00aa11为开头,后续8个字节的内存里的内容,内容的表示方式为10进制

1
2
3
4
5
x/8db 0x00aa11
解释一下:
8:代表看8条地址
b:代表8的单位是单字节(4byte)
d:代表内存的内容用10进制的表现形式给显示出来

5.其他

1
2
3
4
5
6
7
8
9
10
11
disas addr #查看addr处前后的反汇编代码

stack 20 #查看栈内20个值

show args #查看参数

vmmap #查看映射状况 peda带有

readelf #查看elf文件中各个段的起始地址 peda带有

parseheap #显示堆状况 peda带有