5.pwn入门新手 简单练习gdb调试

#gdb命令
在这里插入图片描述(1)frame n: 查看第n桢的信息, frame可以用f缩写
(2)frame addr: 查看pc地址为addr的桢的相关信息
(3)up n: 查看当前桢上面第n桢的信息
(4)down n: 查看当前桢下面第n桢的信息
https://blog.csdn.net/wang_xya/article/details/46011019 这位大佬的命令更为详细
在这里插入图片描述在这里插入图片描述

gdb之x命令

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

x/<n/f/u>

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

n是一个正整数,表示需要显示的内存单元的个数,也就是说从当前地址向后显示几个内存单元的内容,一个内存单元的大小由后面的u定义。

f 表示显示的格式,参见下面。如果地址所指的是字符串,那么格式可以是s,如果地十是指令地址,那么格式可以是i。

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

表示一个内存地址。

注意:严格区分n和u的关系,n表示单元个数,u表示每个单元的大小。

n/f/u三个参数可以一起使用。例如:

命令:x/3uh 0x54320 表示,从内存地址0x54320读取内容,h表示以双字节为一个单位,3表示输出三个单位,u表示按无符号十进制显示。

#include <stdio.h>
int sum(int n)
{
    int ret = 0;
     if( n > 0 )
  {
    ret = n + sum(n-1);
 }
return ret;
}
int main()
{
int s = 0;
s = sum(10);
printf("sum = %d\n", s);
return 0;
}

我们编译一下这个代码 然后用gdb运行
在这里插入图片描述
开始运行
在这里插入图片描述
查看栈中 函数的 调用顺序
在这里插入图片描述
查看寄存器的值
在这里插入图片描述查看当前栈帧的详细信息

在这里插入图片描述
上图中显示的信息有:
a. 当前桢的地址: 0xbffff400
b. 当前桢PC: eip = 0x8048516
c. 当前桢函数: bar (test.cpp:16)
d. caller桢的PC: saved eip 0x8048535
e. caller桢的地址: called by frame at 0xbffff420
f. callee桢的地址: caller of frame at 0xbffff3e0
g. 源代码所用的程序的语言(c/c++): source language c++
h. 当前桢的参数的地址及值: Arglist at 0xbffff3f8, args: name=0x8048621 “jessie”, myname=0x804861c “jack”
i. 当前相中局部变量的地址:Locals at 0xbffff3f8, Previous frame’s sp is 0xbffff400
k. 当前桢中存储的寄存器: Saved registers: ebp at 0xbffff3f8, eip at 0xbffff3fc
!](https://img-blog.csdnimg.cn/20200217171014708.png)

查看栈中的内容从栈顶开始
在这里插入图片描述

发布了9 篇原创文章 · 获赞 20 · 访问量 1516

猜你喜欢

转载自blog.csdn.net/qiudalaojiao/article/details/104359593