gdb暂时给页面写入权限吗?

时间:2011-09-28 11:29:23

标签: linux permissions gdb

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

在GDB中,我在汇编程序中放置了一个断点,它执行了坏存储,当它停在那里时,我使用GDB手动执行了等效的写操作。 GDB在没有任何投诉的情况下做到了这一点,并且阅读价值证明它确实已经写好了。我查看了/ proc / thepid / maps,并且该特定页面仍被标记为“不可写”。

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

1 个答案:

答案 0 :(得分:12)

  

GDB是否暂时设置了写权限

没有

在Linux / * 86上,ptrace()(这是GDB用来读取和编写下级(被调试的)进程内存的内容)允许读取和写入不可读/不可读的页面,导致正是你所描述的混乱。

这可能被视为内核中的错误。

应该注意内核允许ptrace写入通常不可写的.text部分,以便调试器能够设置断点(这是通过覆盖原始来完成的)使用断点/陷阱指令的指令 - int3通过PTRACE_POKETEXT请求。)

内核不必对POKE_DATA执行相同操作,但man ptrace说:

PTRACE_POKETEXT, PTRACE_POKEDATA
   Copies the word data to location addr in the child's memory.
   As above, the two requests are currently equivalent.

我认为这是导致当前行为的等效性。