Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux gdb是否临时授予页面写入权限?_Linux_Permissions_Gdb - Fatal编程技术网

Linux gdb是否临时授予页面写入权限?

Linux gdb是否临时授予页面写入权限?,linux,permissions,gdb,Linux,Permissions,Gdb,我正在调试一个Linux应用程序中的seg故障,该故障是由一个程序试图更改静态常量数组结构引起的(因此数据位于ELF的只读部分,随后加载到一个页面中,该页面随后被授予只读权限) 在GDB中,我在执行坏存储的汇编程序行上放置了一个断点,当它停在那里时,我使用GDB手动执行了等效的写操作。GDB在没有任何抱怨的情况下做到了这一点,回过头来阅读价值证明它确实是写出来的。我查看了/proc/thepid/maps,那个页面仍然被标记为“不可写” 所以我的问题是:GDB是否临时设置只读页面的写权限,执行写

我正在调试一个Linux应用程序中的seg故障,该故障是由一个程序试图更改静态常量数组结构引起的(因此数据位于ELF的只读部分,随后加载到一个页面中,该页面随后被授予只读权限)

在GDB中,我在执行坏存储的汇编程序行上放置了一个断点,当它停在那里时,我使用GDB手动执行了等效的写操作。GDB在没有任何抱怨的情况下做到了这一点,回过头来阅读价值证明它确实是写出来的。我查看了/proc/thepid/maps,那个页面仍然被标记为“不可写”

所以我的问题是:GDB是否临时设置只读页面的写权限,执行写操作,然后重置权限?谢谢

GDB是否临时设置写入权限

没有

在Linux/*86上,
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:请“接受”回答您问题的答案。您可以通过单击您最喜欢的答案左侧的勾选/勾选标记来完成此操作(勾选位于左侧,就在选票下方)。回答者将因被接受的答案而获得声誉积分。