pwndbg调试
pwndbg调试
1.b xx
设置断点(b是breakpoint的缩写)
1 | b 函数名 # 在指定函数的起始处设置断点 |
2.r
运行的意思(r是run的缩写),一般用来代码开始运行,或者重新运行(如果调试到一半又想从头开始运行)
1 | n(不会进入函数内部) |
c:继续执行(c是continue的缩写),当执行r运行到某个断点后,后面想继续执行到下一个断点或者把剩下代码执行完毕,就可以使用c
n:next的意思,执行当前行代码 (当前行是指源程序里的一行代码,就相当于汇编的多条指令)
s:step的意思,当一行代码里有函数调用,那么执行s会跳入函数里执行,如果没有函数调用,那么效果和n相同。看到有想要控制的函数时,就用s,比如ret2text中的vulnerable函数,进入函数内部,再用n运行代码,输入数据调试。
3.info xx
1 | info b #查看断点信息(copy) |
4.p xx
p是print的缩写,打印某个变量的值
1 | p system/main #显示某个函数地址 |
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 | x/8db 0x00aa11 |
5.其他
1 | disas addr #查看addr处前后的反汇编代码 |