为啥我可以在 /proc/pid/maps 输出中看到几个相同的段?

Posted

技术标签:

【中文标题】为啥我可以在 /proc/pid/maps 输出中看到几个相同的段?【英文标题】:Why I can see the several same segments in the /proc/pid/maps output?为什么我可以在 /proc/pid/maps 输出中看到几个相同的段? 【发布时间】:2014-01-10 15:46:12 【问题描述】:

测试在 32 位 Linux 上

代码如下:

int foo(int a, int b)

    int c = a + b;
    return c;


int main()

    int e = 0;
    int d = foo(1, 2);
    printf("%d\n", d);
    scanf("%d", &e);

    return 0;

而当我使用cat /proc/pid/maps查看内存布局时,好像可以看到三个 我的代码和库的 text 段。

ubuntu% cat /proc/2191/maps
08048000-08049000 r-xp 00000000 08:01 1467306    /home/shuai/work/asm/test1
08049000-0804a000 r--p 00000000 08:01 1467306    /home/shuai/work/asm/test1
0804a000-0804b000 rw-p 00001000 08:01 1467306    /home/shuai/work/asm/test1
09137000-09158000 rw-p 00000000 00:00 0          [heap]
b75c6000-b75c7000 rw-p 00000000 00:00 0
b75c7000-b776b000 r-xp 00000000 08:01 3149924    /lib/i386-linux-gnu/libc-2.15.so
b776b000-b776d000 r--p 001a4000 08:01 3149924    /lib/i386-linux-gnu/libc-2.15.so
b776d000-b776e000 rw-p 001a6000 08:01 3149924    /lib/i386-linux-gnu/libc-2.15.so
b776e000-b7771000 rw-p 00000000 00:00 0
b7780000-b7784000 rw-p 00000000 00:00 0
b7784000-b7785000 r-xp 00000000 00:00 0          [vdso]
b7785000-b77a5000 r-xp 00000000 08:01 3149914    /lib/i386-linux-gnu/ld-2.15.so
b77a5000-b77a6000 r--p 0001f000 08:01 3149914    /lib/i386-linux-gnu/ld-2.15.so
b77a6000-b77a7000 rw-p 00020000 08:01 3149914    /lib/i386-linux-gnu/ld-2.15.so
bfd47000-bfd68000 rw-p 00000000 00:00 0          [stack]

谁能给我一些关于这个问题的指导?非常感谢!

【问题讨论】:

【参考方案1】:

请注意第 3 列(起始偏移量)和第 2 列(权限)中的值。实际上,您在二进制文件的第 1 行和第 2 行中将相同的部分映射了两次,但是在第 3 行中,它是不同的。允许多次单独映射同一个文件;不同的系统可以跳过将其合并到一个 VM 映射条目中,因此它可以反映映射历史,但不能反映当前状态 jist。

如果您在库映射中看到,您可以轻松找到任何库单独映射的规律:

具有读取和执行权限:不应更改的主要代码。 有读取权限:允许无代码的常量数据区。 具有读写权限:结合了非常量数据区和共享对象的重定位表。

由于引导需要,RTLD 逻辑与任意库逻辑不同,可以解释两次映射相同的起始 4K 二进制文件区域。我不认为它那么重要,更重要的是它很容易在平台细节上有所不同。

【讨论】:

【参考方案2】:

请注意,每个文件的三个部分具有不同的权限:只读、读写和读取-执行。这是为了安全:代码段(读-执行)不能通过exploit写入,可以写入的段也不能执行。

【讨论】:

以上是关于为啥我可以在 /proc/pid/maps 输出中看到几个相同的段?的主要内容,如果未能解决你的问题,请参考以下文章

了解 Linux /proc/pid/maps 或 /proc/self/maps

/proc/$pid/maps 在 x86_64 linux 上显示没有 rwx 权限的页面

ESP 在 /proc/pid/maps 和二进制文件中不同

linux proc maps文件分析

安卓如何查看进程信息,都说是用ps看到pid后根据pid去/proc/pid/maps中去看调用的

/proc/$PID/maps文件解读