了解 ELF64 text/data 段 layout/padding
Understanding ELF64 text/data segment layout/padding
我正在复习 UNIX 病毒,我正在阅读的一篇文章提到寄生代码可以插入到文本和数据段之间的填充中,据推测在 x86-64 上大小可达 2MB系统。但是当我用 gcc -no-pie
...
编译一个简单的 hello world 程序时
#include <stdio.h>
int main()
{
printf("hello world\n");
}
...并用 readelf -W -l
检查其段 headers 我得到:
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
PHDR 0x000040 0x0000000000400040 0x0000000000400040 0x0002d8 0x0002d8 R 0x8
INTERP 0x000318 0x0000000000400318 0x0000000000400318 0x00001c 0x00001c R 0x1
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
LOAD 0x000000 0x0000000000400000 0x0000000000400000 0x000588 0x000588 R 0x1000
LOAD 0x001000 0x0000000000401000 0x0000000000401000 0x0001c5 0x0001c5 R E 0x1000
LOAD 0x002000 0x0000000000402000 0x0000000000402000 0x000138 0x000138 R 0x1000
LOAD 0x002e00 0x0000000000403e00 0x0000000000403e00 0x000230 0x000238 RW 0x1000
DYNAMIC 0x002e10 0x0000000000403e10 0x0000000000403e10 0x0001d0 0x0001d0 RW 0x8
...
我假设从虚拟地址 0x401000
开始的段是文本段,从 0x430e00
开始的段是数据段。但是另外两个 read-only LOAD 段是什么?填充在这里的工作精确度如何?没有看到 2MB 边界的填充,甚至假设填充到 4KB 边界,为什么数据段不从地址 0x403000
开始?
But what are the other two read-only LOAD segment?
见。
There's no padding to 2MB boundaries
BFD 链接器用于在 2MiB 边界上对齐段,因为这是 x86_64
系统可以配置的最大页面大小。
它不再这样做(不确定何时进行更改)。
您正在阅读的文字可能已过时。
我正在复习 UNIX 病毒,我正在阅读的一篇文章提到寄生代码可以插入到文本和数据段之间的填充中,据推测在 x86-64 上大小可达 2MB系统。但是当我用 gcc -no-pie
...
#include <stdio.h>
int main()
{
printf("hello world\n");
}
...并用 readelf -W -l
检查其段 headers 我得到:
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
PHDR 0x000040 0x0000000000400040 0x0000000000400040 0x0002d8 0x0002d8 R 0x8
INTERP 0x000318 0x0000000000400318 0x0000000000400318 0x00001c 0x00001c R 0x1
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
LOAD 0x000000 0x0000000000400000 0x0000000000400000 0x000588 0x000588 R 0x1000
LOAD 0x001000 0x0000000000401000 0x0000000000401000 0x0001c5 0x0001c5 R E 0x1000
LOAD 0x002000 0x0000000000402000 0x0000000000402000 0x000138 0x000138 R 0x1000
LOAD 0x002e00 0x0000000000403e00 0x0000000000403e00 0x000230 0x000238 RW 0x1000
DYNAMIC 0x002e10 0x0000000000403e10 0x0000000000403e10 0x0001d0 0x0001d0 RW 0x8
...
我假设从虚拟地址 0x401000
开始的段是文本段,从 0x430e00
开始的段是数据段。但是另外两个 read-only LOAD 段是什么?填充在这里的工作精确度如何?没有看到 2MB 边界的填充,甚至假设填充到 4KB 边界,为什么数据段不从地址 0x403000
开始?
But what are the other two read-only LOAD segment?
见
There's no padding to 2MB boundaries
BFD 链接器用于在 2MiB 边界上对齐段,因为这是 x86_64
系统可以配置的最大页面大小。
它不再这样做(不确定何时进行更改)。
您正在阅读的文字可能已过时。