内存中的哪些部分是可写的?

ibl*_*lue 3 c linux elf

我正在运行一些C代码,在Linux上编译为32位x86.而我正试图访问一些内存.显然我可以写入.bss.data堆栈.前段时间,.ctors和.dtors段曾经是可写的,但似乎它们已经消失了.

如果没有反复试验,我怎样才能找到内存中哪些部分被映射?如何找出哪些地址映射到可写内存以及哪些地址是可执行的?

Emp*_*ian 5

如果没有反复试验,我怎样才能找到内存中哪些部分被映射?

当您谈论ELF可执行文件时,章节和段具有特定含义,并且您在上面的用法与该含义不一致.

ELF部分在加载时无关紧要,只有(可加载)段.

readelf -l a.out命令提供从ELF部分到段的映射.例如

readelf -l /bin/date

Elf file type is EXEC (Executable file)
Entry point 0x8048c60
There are 6 program headers, starting at offset 52

Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  PHDR           0x000034 0x08048034 0x08048034 0x000c0 0x000c0 R E 0x4
  INTERP         0x0000f4 0x080480f4 0x080480f4 0x00013 0x00013 R   0x1
      [Requesting program interpreter: /lib/ld-linux.so.2]
  LOAD           0x000000 0x08048000 0x08048000 0x05fe0 0x05fe0 R E 0x1000
  LOAD           0x006000 0x0804e000 0x0804e000 0x00208 0x00334 RW  0x1000
  DYNAMIC        0x006078 0x0804e078 0x0804e078 0x000c8 0x000c8 RW  0x4
  NOTE           0x000108 0x08048108 0x08048108 0x00020 0x00020 R   0x4

 Section to Segment mapping:
  Segment Sections...
   00
   01     .interp
   02     .interp .note.ABI-tag .hash .dynsym .dynstr .gnu.version .gnu.version_r .rel.dyn .rel.plt .init .plt .text .fini .rodata
   03     .data .eh_frame .dynamic .ctors .dtors .jcr .got .bss
   04     .dynamic
   05     .note.ABI-tag
Run Code Online (Sandbox Code Playgroud)

这告诉您.ctors映射到段3,它是可写的(此输出来自古代UnitedLinux 1.0分布).

如今,通过特殊部分搬迁后,.ctors被放入一个不同的部分.data,并保护其免于写入GNU_RELRO.