是否期望在反向调试期间不会恢复对程序地址空间所做的更改?
我一直在调试一个程序,当strlen
GOT 中的指针在执行过程中损坏时,该程序会出现段错误。感谢来自对此问题的评论的建议,我通过链接选项将该程序的 GOT 设为只读-z relro
;但是,这并不能防止有问题的指针被覆盖。即我可以在gdb中start
的程序,跳到第一次出现的,strlen
验证指针是否有效(例如:程序;例如:),提示.x/g 0x5555555d10a8 ==> 0x5555555d10a8 <strlen@got.plt>: 0x00007ffff7e8d1e0
continue
x/g 0x5555555d10a8 ==>
0x5555555d10a8 <strlen@got.plt>: 0x0000000000002156
segv
但是,如果我record full
整个执行(从第一行到程序段错误),然后awatch
是带有指针的地址strlen
during reverse-continue
,则观察点永远不会触发。当程序最终回到指令#0时,指针仍然指向它在段错误时所拥有的无效地址。
这导致了两个问题。首先,尽管有链接器选项,为什么 GOT 是可变的-z relro
?其次,是否期望strlen
在程序执行期间更改的内存中的某个位置(指向 的指针)在反向执行期间不会恢复到其原始值?