Linux gdb汇编调试

文章目录

  • 一、示例代码
  • 二、gdb汇编指令
    • 2.1 step/stepi
    • 2.2 next/nexti
    • 2.3 info registers
    • 2.4 set
    • 2.5 x
    • 2.6 rsp寄存器
    • 2.7 rip 寄存器
  • 参考资料

一、示例代码

(1)

#include <stdio.h>int add(int a, int b)
{return a + b;
}int main()
{int a = 3;int b = 5;int c = add(a, b);printf("c = %d\n", c);return 0;
}

main,add函数下断点:
在这里插入图片描述
main函数调用 call add函数时,将下一条指令的地址0x400566压入栈中,然后跳转到函数add的地址 0x40052d处去执行。

call 指令等价于:

push 0x400566
jmp 0x40052d(add)

在这里插入图片描述
进入到 add 函数,在执行 ret 指令之前,然后 rsp 寄存器的内存地址中的值是 0x400566,即main函数调用add函数压入栈中的地址,执行 stepi指令,add函数执行 ret 指令,pop出该地址 0x400566 ,然后跳转到 0x400566 地址去执行指令,rip寄存器的值也是 0x400566。

ret 指令等效于:

pop 0x400566
jmp 0x400566

(2)
接下来修改一下这个返回地址,调用 add时,add返回地址应该是 0x400566,我们将其修改为0x40056c。
在这里插入图片描述
在这里插入图片描述
可以看到当在 add 调用 ret 指令后,将要执行的下一条指令的地址存放在 0x40056c 中而不是 call add 的下一条指令的地址。

二、gdb汇编指令

2.1 step/stepi

(1)step:用于单步执行程序并停在下一个源代码行,会进入函数。
使用 step 命令时,GDB 会执行当前行的代码,如果当前行包含函数调用,GDB 会跳进函数并停在函数内的第一行代码。如果当前行不包含函数调用,GDB 会停在下一行代码处。如果程序在当前行内包含多条语句,GDB 会执行完当前行内的所有语句并停在下一行代码处。

(2)stepi:以单步执行程序的汇编指令,汇编指令call 函数时,会进入函数。
用于单步执行一条汇编指令并停止。与 step 命令不同的是,step 命令会将当前源代码行(比如C源代码行)作为一个单独的步骤来执行,而 stepi 命令会将汇编指令作为执行的最小单位。

使用 stepi 命令时,GDB 会执行当前指令,并将 PC 寄存器指向下一条指令,然后停止程序的执行。如果当前指令是跳转指令,那么 stepi 命令会跳转到跳转指令的目标地址继续执行。如果当前指令是函数调用指令,那么 stepi 命令会跳转到被调用函数的入口地址,等待下一个命令。

stepi 命令是按照汇编指令执行的,而不是按照源代码行执行的。

2.2 next/nexti

next:用于单步执行程序并停在下一行源代码,不会进入函数。
使用 next 命令时,GDB 会执行当前行的代码,如果当前行包含函数调用,GDB 会跳过函数并停在函数调用的下一行代码。如果当前行不包含函数调用,GDB 会停在下一行代码处。如果程序在当前行内包含多条语句,GDB 只会执行当前行的第一条语句并停在下一行代码处。

nexti:用于执行下一条汇编指令并停止。
使用 nexti 命令时,GDB 会执行当前指令,并将 PC 寄存器指向下一条指令,然后停止程序的执行。如果当前指令是跳转指令,那么 nexti 命令会跳转到跳转指令的目标地址继续执行。如果当前指令是函数调用指令,那么 nexti 命令会将函数作为一个整体执行,并在函数返回时停止。

nexti 命令是按照汇编指令执行的,而不是按照源代码行执行的。

2.3 info registers

info registers 用于查看当前程序的寄存器状态,包括通用寄存器、浮点寄存器、协处理器寄存器等。

使用 info registers 命令时,GDB 会列出当前程序的寄存器状态,每个寄存器的名称、值和格式(十六进制或十进制)都会被显示出来。通常情况下,一般只需要查看一部分寄存器的值,可以使用 info registers 命令后面跟上寄存器名称的方式来查看指定寄存器的值。比如:

(gdb) info registers rsp

可以使用 set $register=value 命令来设置寄存器的值,以便进行调试和测试。

2.4 set

用于设置变量、内存地址、寄存器或者其他 GDB 配置选项的值。使用 set 命令可以在调试过程中修改变量的值或者更改 GDB 的配置选项,以便更好地进行调试和分析。

2.5 x

显示内存中的内容,格式如下:
x/[n][f][size] address:其中,n表示要显示的数据的数量,f表示要显示的数据的格式,size表示每个数据的大小,address表示要显示的内存地址。

f 选项可以用于指定要显示的数据的格式。下面是一些常见的数据格式:
x: 以十六进制格式显示数据。
d: 以十进制格式显示数据。
u: 以十进制无符号整数格式显示数据。
o: 以八进制格式显示数据。
t: 以二进制格式显示数据。
a: 以地址格式显示数据。
c: 以字符格式显示数据。
f: 以浮点数格式显示数据。
s: 以字符串格式显示数据。
i: 以指令格式显示数据。

size 选项可以用于指定要显示的每个数据的大小。下面是一些常见的数据大小选项:
b: 每个数据的大小为1字节(即8位)。
h: 每个数据的大小为2字节(即16位)。
w: 每个数据的大小为4字节(即32位)。
g: 每个数据的大小为8字节(即64位)。

2.6 rsp寄存器

rsp 寄存器是 x86_64 架构中的一个 64 位寄存器,用于存储栈指针(Stack Pointer,SP)。栈指针是一个指向当前栈顶的内存地址的指针,用于指示下一个入栈或出栈操作的位置。

在函数调用时,rsp 寄存器会被用于存储当前函数的栈帧信息,包括函数的返回地址、参数、局部变量等。在函数返回时,rsp 寄存器会被重新设置为之前保存的值,以便恢复上一个函数的栈帧信息。

在程序执行过程中,rsp 寄存器的值会随着栈的变化而不断改变。当程序执行入栈操作时,rsp 寄存器的值会减小,指向新的栈顶位置。当程序执行出栈操作时,rsp 寄存器的值会增加,指向上一个栈顶位置。

在 GDB 中,可以使用 info registers 命令或 print $rsp 命令来查看 rsp 寄存器的值。

同时,可以使用 x 命令来查看栈内存的内容,例如:

(gdb) x/8xg $rsp

这样就可以以十六进制格式查看栈顶的 8 个 64 位数据。

2.7 rip 寄存器

rip 寄存器是 x86_64 架构中的一个 64 位寄存器,用于存储指令指针(Instruction Pointer,IP)。指令指针是一个指向下一条将要执行的指令的地址的指针,用于指示程序的执行位置。

在程序执行过程中,rip 寄存器的值会随着指令的执行而不断改变。当程序执行一条指令时,rip 寄存器的值会自动增加,指向下一条指令的地址。如果程序遇到跳转指令,rip 寄存器的值会被修改为跳转目标的地址,以便程序跳转到指定位置继续执行。

在 GDB 中,可以使用 info registers 命令或 print $rip 命令来查看 rip 寄存器的值。

(gdb) print $rip
$1 = (void (*)()) 0x400537 <add+10>
(gdb) info registers rip
rip            0x400537 0x400537 <add+10>

参考资料

https://cloud.tencent.com/developer/article/1646414

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/4666.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python】数据可视化利器PyCharts在测试工作中的应用

点击跳转原文&#xff1a;【Python】数据可视化利器PyCharts在测试工作中的应用 实际应用&#xff1a;常态化性能压测数据统计 import random from pyecharts.charts import Line, Bar, Grid, Pie, Page from pyecharts import options as opts # 查询过去 8 次数据 time_rang…

MVVM 实现记录文本

1. MVVM 框架说明: Model - 数据层 View - 视图层 ViewModel - 管理模型的视图 2. 资源文件 2.1 启动图标: AppIconhttps://img-blog.csdnimg.cn/8fa1031489f544ef9757b6b3ab0eddbe.png 2.2 Display Name: Do Stuff 2.2 颜色图: 2.3 项目结构图: 3. Model 层实现&a…

组合(力扣)dfs + 回溯 + 剪枝 JAVA

给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ] 示例 2&#xff1a; 输入&#xff1a;n 1, …

鲸鱼优化算法MATLAB代码

论文 Seyedali Mirjalili,Andrew Lewis. The Whale Optimization Algorithm[J]. Advances in Engineering Software,2016,95.func_plot.m % This function draw the benchmark functionsfunction func_plot(func_name)[lb,ub,dim,fobj]Get_Functions_details(func_name);switch…

数据结构(王道)——线性表之静态链表顺序表和链表的比较

一、静态链表 定义&#xff1a; 代码实现&#xff1a; 如何定义一个静态链表 静态链表的基本操作思路&#xff1a; 初始化静态链表&#xff1a; 静态链表的查找、插入、删除 静态链表总结&#xff1a; 二、顺序表和链表的比较 逻辑结构对比&#xff1a; 存储结构对比&#xff…

vue3 引入dataV 报错,使用patch-package记录插件包 node_modeule 修改记录。 vite 版DataV

开发数字大屏功能&#xff0c;引用dataV UI组件库比较好用&#xff0c;目前分为Vue2 和 Vue3 两个版本。 Vue2 --DataV版本 yarn add jiaminghi/data-viewVue3 --DataV版本 yarn add dataview/datav-vue3vite – --DataV版本 //不想动手改的&#xff0c;也可以使用此版本&a…

【Zookeeper】

目录 一、Zookeeper 概述1、Zookeeper 定义2、Zookeeper 工作机制3、Zookeeper 特点4、Zookeeper 数据结构5、Zookeeper 应用场景6、Zookeeper 选举机制 二、部署 Zookeeper 集群1.安装前准备1、关闭防火墙2、安装 JDK3、下载安装包 2.安装 Zookeeper1、修改配置文件2、拷贝配置…

被字节拷打了~基础还是太重要了...

今天分享一篇一位同学去字节面试的实习面经&#xff0c;技术栈是java&#xff0c;投了go后端岗位&#xff0c;主要拷打了 redismysql网络系统java算法&#xff0c;面试问题主要集中在 mysql、redis、网络这三部门&#xff0c;因为面试官是搞 go 的&#xff0c;java 只是随便问了…

【微信机器人开发

现在并没有长期免费的微信群机器人&#xff0c;很多都是前期免费试用&#xff0c;后期进行收费&#xff0c;或者核心功能需要付费使用的。 这时如果需要群机器人帮助我们管理群聊&#xff0c;建议大家使有条件的可以自己开发微信管理系统。了解微信群机器人的朋友都知道&#x…

Mysql数据库之事务

目录 一、事务的概念 二、事务的ACID特点 1.原子性&#xff08;Atomicity&#xff09; 2.一致性&#xff08;Consistency&#xff09; 3.隔离性&#xff08;lsolation&#xff09; 4.持久性&#xff08;Durability) 三、并发访问表的一致性问题和事务的隔离级别 1.并发访…

Windows下 创建 FTP 服务器及相关设置

Windows 创建 FTP 服务器 1. 示例功能说明 FTP 服务器根路径下的目录&#xff1a; C:\USERS\SQQIAN\DESKTOP\FTP └─localuser├─FTP1 # 只有用户名为FTP1可以访问&#xff0c;读写均可│ FTP11.txt│├─FTP2 # 只有用户名为FTP2…

好家伙,9:00面试,9:06就出来了,问的实在是太...

从外包出来&#xff0c;没想到死在另一家厂子 自从加入这家公司&#xff0c;每天都在加班&#xff0c;钱倒是给的不少&#xff0c;所以也就忍了。没想到2月一纸通知&#xff0c;所有人不许加班&#xff0c;薪资直降30%&#xff0c;顿时有吃不起饭的赶脚。 好在有个兄弟内推我去…

zabbix-server监控mysql数据库及httpd服务、监控apache、监控ftp

目录 一、监控mysql数据库及httpd服务 1、为server.Zabbix.com添加服务模板 2、server.zabbix.com服务端 操作 3、编辑chk_mysql.sh脚本 4、server.zabbix.com测试 二、监控apache 1、获取键值 2、服务器操作 3、zabbix监控web端导入监控模板 4、server.zabbix.com添加…

前端多行文本省略号

.title {height: 4rem;line-height: 2rem;// 多行文本省略号overflow: hidden;font-size: 1.4rem;display: -webkit-box;-webkit-box-orient: vertical;-webkit-line-clamp: 2;}

Pycharm远程服务器上运行程序报错:Can‘t get remote credentials for deployment server

一、问题描述&#xff1a; 二、解决方法&#xff1a; 1.依次选择 文件 -> 设置 -> 项目 -> Python 解释器,出现如下界面&#xff1a; 2. 点击python 解释器右侧的小齿轮&#xff0c;选择全部显示&#xff1a; 3. 在弹出的窗口中发现存在多个连接到同一个服务器的解释…

【protobuf】socket.io序列化和反序列化

1.背景 后台利用socket.io发送websocket消息&#xff0c;加密用到protobuf 2.反序列化时遇到问题 Traceback (most recent call last): File "D:/locust/Nigeria/test3.py", line 40, in <module> play.ParseFromString(decode_spin_str) google.proto…

chrome edge svg转png

chrome edge svg转png 生成SVG blockdiag Live Preview 导出png 截图&#xff1a; 左上角截取屏幕截图

【基于 GitLab 的 CI/CD 实践】02、gitlab-runner 实践

目录 一、gitlab-runner 简介 1.1 要求 1.2 特点 二、GitLab Runner 安装 2.1 使用 GItLab 官方仓库安装 2.2 使用 deb/rpm 软件包 2.3 在容器中运行 GitLab Runner 三、GitLab Runner 注册 3.1 GitLabRunner 类型 3.2 获取 runner token 获取 shared 类型 runner t…

基于Gerapy部署分布式爬虫管理平台

文章目录 1. 服务器安装scrapyd1.1 scrapyd安装1.2 scrapyd配置允许外网访问1.3 服务器安全组开启端口1.4 服务器防火墙开启端口1.5 scrapyd测试 2. Gerapy 环境搭建2.1 gerapy安装2.2 gerapy测试2.3 项目部署2.4 定时任务2.5 线上代码修改 Gerapy是一个Python的分布式爬虫部署…

基于单片机的智能台灯 灯光控制系统人体感应楼梯灯系统的设计与实现

功能介绍 以STM32单片机作为主控系统&#xff1b;主通过光敏采集当前光线强度&#xff1b;通过PMW灯光调节电路&#xff0c;我们可以根据不同的光线亮度&#xff0c;进行3挡调节&#xff1b;通过人体红外检测当前是否有人&#xff1b;通过不同光线情况下使用PWM脉冲电路进行调节…