我正在運行一些C代碼,編譯爲Linux上的32位x86。我正在嘗試訪問一些內存。 Apperently我可以寫信給.bss
和.data
和堆棧。前段時間,.ctors and .dtors segments used to be writable,但似乎他們已經走了。內存中的哪些部分是可寫的?
未經審判和錯誤,我怎麼能發現到這部分內存中的段映射?我怎樣才能找出哪些地址映射到可寫內存,哪些是可執行的?
我正在運行一些C代碼,編譯爲Linux上的32位x86。我正在嘗試訪問一些內存。 Apperently我可以寫信給.bss
和.data
和堆棧。前段時間,.ctors and .dtors segments used to be writable,但似乎他們已經走了。內存中的哪些部分是可寫的?
未經審判和錯誤,我怎麼能發現到這部分內存中的段映射?我怎樣才能找出哪些地址映射到可寫內存,哪些是可執行的?
如果沒有反覆試驗,我怎麼才能知道片段映射到哪些片段?
當您談論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
這就告訴你,.ctors
被映射到段3,它是可寫的(這是輸出從古代UnitedLinux 1.0
分佈)。
如今,.ctors
被放入與.data
不同的段中,並且在通過特殊的GNU_RELRO
段進行重新定位後不會被寫入。
看/proc/$pid/maps
(或使用pmap
實用程序)。它會告訴你比你想知道的內存區域更多。
重複的http://stackoverflow.com/questions/2152958/reading-memory-protection – ecatmur