当前位置: 首页 > article >正文

gdb逆向调试功能太强了~

在RSP地址设置数据断点

  • RSP(栈指针寄存器):在计算机体系结构中,RSP是一个关键寄存器,它指向栈顶位置。栈是一种数据结构,用于存储函数调用信息、局部变量等。在RSP地址处设置数据断点,就是为了监控栈顶位置的数据变化。例如,当程序运行涉及到栈的操作,如函数调用(会把返回地址等压栈)、局部变量的存储等情况时,这个断点就能捕捉到相关数据的改变。

反向调试与硬件数据断点失效

  • 反向调试:正常调试是正向执行程序来查找问题,而反向调试允许你逆向追踪程序的执行过程,就像倒放录像一样。这对于查找一些难以定位的错误,特别是那些在程序运行一段时间后才出现的问题很有帮助。
  • 硬件数据断点失效:硬件数据断点是利用CPU提供的硬件支持来设置的断点,它能够高效地监控特定内存地址的数据变化。但是在提到的这个GDB版本中,当进行反向调试时,这种硬件支持的功能不能正常工作。

“set can - use - hw - watchpoints 0”命令和软件断点

  • 强制使用软件断点:由于硬件数据断点在反向调试时失效,所以使用“set can - use - hw - watchpoints 0”命令来告诉GDB不要使用硬件断点。软件断点则是通过软件模拟实现的断点机制,它可能没有硬件断点那么高效,但在这种硬件断点失效的场景下(如反向调试)可以作为一种替代方案来监控数据变化。

程序调试
(gdb) p $rsp
$1 = (void *) 0x7fffffffe360
(gdb) set can-use-hw-watchpoints 0
(gdb) watch *(long *)0x7fffffffe360
Watchpoint 2: *(long *)0x7fffffffe360
(gdb) i b
Num Type Disp Enb Address What
2 watchpoint keep y *(long *)0x7fffffffe360
(gdb)

调试解读

这是在GDB调试器中设置栈上断点的操作过程:

  1. 获取栈指针地址(RSP)
  • 首先使用 p $rsp 命令来打印栈指针寄存器(RSP)的值。从截图中可以看到, $rsp 的值是 0x7fffffffe360 。这一步是为了确定栈的位置。
  • 输出: $1 = (void *) 0x7fffffffe360
  1. 禁用硬件观察点(如果需要)
  • 使用 set can - use - hw - watchpoints 0 命令来强制GDB使用软件断点。这在某些情况下是必要的,例如在进行反向调试时,硬件数据断点可能会失效。
  1. 设置数据断点
  • 使用 watch *(long *)0x7fffffffe360 命令来设置一个数据断点。这里将 0x7fffffffe360 这个地址(之前获取的栈指针地址)强制转换为 long 类型的指针,并对其设置观察点(watchpoint)。
  • 输出: Watchpoint 2: *(long *)0x7fffffffe360
  1. 查看断点信息
  • 使用 i b 命令来查看已经设置的断点信息。从截图中可以看到,断点2是一个观察点(watchpoint),并且是启用的( keep y ),它监视的地址是 *(long *)0x7fffffffe360 。
  • 输出:
    plaintext

Num Type Disp Enb Address What
2 watchpoint keep y *(long *)0x7fffffffe360

总结:通过获取栈指针地址,然后在该地址上设置数据断点(观察点),就可以在栈上设置断点了。这样,当程序执行到改变该栈地址上数据的操作时,GDB就会暂停程序执行,以便你进行调试。


http://www.kler.cn/a/428005.html

相关文章:

  • Autogen_core源码:_agent_runtime.py
  • .NET Core缓存
  • 物联网智能项目之——智能家居项目的实现!
  • python算法和数据结构刷题[2]:链表、队列、栈
  • 【仓颉】仓颉编程语言Windows安装指南 配置环境变量 最简单解决中文乱码问题和其他解决方案大全
  • MYSQL 商城系统设计 商品数据表的设计 商品 商品类别 商品选项卡 多表查询
  • pycharm报错
  • centos7.9编译升级openssl和openssh的记录
  • 【JVM】JVM基础教程(一)
  • 阳光电脑公司的维修服务微信小程序ssm+论文源码调试讲解
  • 数据库原理实验实验二 SQL SERVER查询分析器的使用
  • Unity在运行状态下,当物体Mesh网格发生变化时,如何让MeshCollider碰撞体也随之实时同步变化?
  • HTTP 网络技术学习:缓存;为什么有时候出现问题要清除浏览器缓存?客户端缓存和服务端缓存是什么。
  • LLMs之Agent之Lares:Lares的简介、安装和使用方法、案例应用之详细攻略
  • PyTorch 切片运算 (Slice Operator)
  • 【人工智能】用Python构建高效的自动化数据标注工具:从理论到实现
  • MySQL 存储引擎详解
  • 负载均衡OJ项目中遇到的问题
  • 我的“ai学伴”助力“程序”迭代
  • 应用案例 | 船舶海洋: 水下无人航行器数字样机功能模型构建
  • RK3568平台(内存篇)DDR定频修改
  • OD C卷【热点网站统计】
  • 漫画之家Spring Boot应用:打造您的数字漫画馆
  • 如何从命令行和用户输入收集输入
  • 读取csv里面的文件数据画曲线
  • B4X编程语言:B4J控件的样式设置属性(Style/StyleClasses)