2012-06-10 19 views
3

我正在運行一些C代碼,編譯爲Linux上的32位x86。我正在嘗試訪問一些內存。 Apperently我可以寫信給.bss.data和堆棧。前段時間,.ctors and .dtors segments used to be writable,但似乎他們已經走了。內存中的哪些部分是可寫的?

未經審判和錯誤,我怎麼能發現到這部分內存中的段映射?我怎樣才能找出哪些地址映射到可寫內存,哪些是可執行的?

+0

重複的http://stackoverflow.com/questions/2152958/reading-memory-protection – ecatmur

回答

4

如果沒有反覆試驗,我怎麼才能知道片段映射到哪些片段?

當您談論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段進行重新定位後不會被寫入。

3

/proc/$pid/maps(或使用pmap實用程序)。它會告訴你比你想知道的內存區域更多。

相關問題