Linux gdb是否临时授予页面写入权限?
我正在调试一个Linux应用程序中的seg故障,该故障是由一个程序试图更改静态常量数组结构引起的(因此数据位于ELF的只读部分,随后加载到一个页面中,该页面随后被授予只读权限) 在GDB中,我在执行坏存储的汇编程序行上放置了一个断点,当它停在那里时,我使用GDB手动执行了等效的写操作。GDB在没有任何抱怨的情况下做到了这一点,回过头来阅读价值证明它确实是写出来的。我查看了/proc/thepid/maps,那个页面仍然被标记为“不可写” 所以我的问题是:GDB是否临时设置只读页面的写权限,执行写操作,然后重置权限?谢谢 GDB是否临时设置写入权限 没有 在Linux/*86上,Linux gdb是否临时授予页面写入权限?,linux,permissions,gdb,Linux,Permissions,Gdb,我正在调试一个Linux应用程序中的seg故障,该故障是由一个程序试图更改静态常量数组结构引起的(因此数据位于ELF的只读部分,随后加载到一个页面中,该页面随后被授予只读权限) 在GDB中,我在执行坏存储的汇编程序行上放置了一个断点,当它停在那里时,我使用GDB手动执行了等效的写操作。GDB在没有任何抱怨的情况下做到了这一点,回过头来阅读价值证明它确实是写出来的。我查看了/proc/thepid/maps,那个页面仍然被标记为“不可写” 所以我的问题是:GDB是否临时设置只读页面的写权限,执行写
ptrace()
(GDB用来读取和写入下级(正在调试的)进程内存)允许读取和写入下级无法读取/写入的页面,这恰恰导致了您所描述的混乱
这可能被认为是内核中的一个bug
应该注意的是,内核必须允许ptrace写入通常不可写的.text
部分,调试器才能植入断点(这是通过ptrace\u POKETEXT
请求用断点/trap指令--int3
覆盖原始指令来完成的)
内核不必对POKE_DATA
执行相同的操作,但是manptrace
表示:
PTRACE_POKETEXT, PTRACE_POKEDATA
Copies the word data to location addr in the child's memory.
As above, the two requests are currently equivalent.
我相信正是这种等价性导致了当前的行为。@gimmemamilk:请“接受”回答您问题的答案。您可以通过单击您最喜欢的答案左侧的勾选/勾选标记来完成此操作(勾选位于左侧,就在选票下方)。回答者将因被接受的答案而获得声誉积分。