2012-05-25 36 views
0

我学习了明天要考试,我碰到这个问题跑了:libc.so MMAP strace的

我们运行与strace的下列系统调用的可执行文件后的结果有关标准的C lib目录下:

  • 开放(” /lib/libc.so.6" , “O_RDONLY”)= 3
  • MMAP(NULL,36803630,PROT_READ | PROT_EXEC,MAP_PRIVATE | MAP_DENYWRITE,3,0)= 0x7f312ab35000
  • MMAP(0x7f312aeae000,20480,PROT_READ | PROT_WRITE,MAP_PRIVATE | MAP_FIXED | MAP_DENYWRITE,3 ,0x179000)= 0x7f312aeae000

问题是为什么mmap的第一个系统调用使用PROT_READ | PROT_EXEC,第二个是PROT_READ | PROT_WRITE。

请详细解释每次mmap调用后会发生什么情况。我不明白为什么一个进程需要修改libc(写入权限)。

回答

1

该地图是私人的(MAP_PRIVATE),所以没有任何修改libc.so;相反,它正在修改从libc.so映射的页面的私人(到过程)副本。这将包括数据段(libc中的全局变量)以及全局偏移表(GOT)以及在运行时将库重定位到特定地址所涉及的其他结构。

+0

为什么PROT_EXEC消失? –

+0

数据不需要可执行;它是数据,而不是代码。并且使可写内存可执行文件被认为是一种安全风险,因为它通过允许攻击者放置代码而扩展了可以提升为任意代码执行的漏洞类别。许多强化系统甚至不允许同时写入执行权限的内存映射。 –