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调试器中设置栈上断点的操作过程:
- 获取栈指针地址(RSP)
- 首先使用 p $rsp 命令来打印栈指针寄存器(RSP)的值。从截图中可以看到, $rsp 的值是 0x7fffffffe360 。这一步是为了确定栈的位置。
- 输出: $1 = (void *) 0x7fffffffe360
- 禁用硬件观察点(如果需要)
- 使用 set can - use - hw - watchpoints 0 命令来强制GDB使用软件断点。这在某些情况下是必要的,例如在进行反向调试时,硬件数据断点可能会失效。
- 设置数据断点
- 使用 watch *(long *)0x7fffffffe360 命令来设置一个数据断点。这里将 0x7fffffffe360 这个地址(之前获取的栈指针地址)强制转换为 long 类型的指针,并对其设置观察点(watchpoint)。
- 输出: Watchpoint 2: *(long *)0x7fffffffe360
- 查看断点信息
- 使用 i b 命令来查看已经设置的断点信息。从截图中可以看到,断点2是一个观察点(watchpoint),并且是启用的( keep y ),它监视的地址是 *(long *)0x7fffffffe360 。
- 输出:
plaintext
Num Type Disp Enb Address What
2 watchpoint keep y *(long *)0x7fffffffe360
总结:通过获取栈指针地址,然后在该地址上设置数据断点(观察点),就可以在栈上设置断点了。这样,当程序执行到改变该栈地址上数据的操作时,GDB就会暂停程序执行,以便你进行调试。
原文地址:https://blog.csdn.net/qq_33471732/article/details/144334208
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!