ELF文件:data段開始的位置爲什麼沒有進行進行對齊?

問題:

如下圖所示,第一個是text段、第二個是data段,Align對齊:0x1000(4kb)對齊。
問: 爲什麼data段虛擬地址的起始位置不是0x08049000?
在這裏插入圖片描述

答:
下面這幅圖是程序執行後的內存分佈圖,第一個是text段區域,第二個是隻讀數據區,第三個是讀寫數據區。

根據下面這個程序運行時的內存分佈圖可以知道,0x49000開始的區域是隻讀數據。

主要組成是填充區域和.ctors,.dtors,.dynamic,.got部分(重定位完成後的只讀數據區域),這個可以根據上面的ELF格式中第二個需要加載的data段虛擬起始位置爲0x08049f08(EFL規範p_vaddr ( mod PAGE_SIZE )=p_offset ( mod PAGE_SIZE )),那麼可以從內存中看到0x08049000到0x08049f08的值是填充值,並且根據上面圖中ELF格式中的GNU_RELRO(內存中的地址剛好是一個內存頁的尾部:0x08049f08-0x0804a000),參考[3]中的解釋,這個內存頁尾部包含了重定位後的只讀數據。

然後下一個內存頁0x084a000-0x084b000就是可以讀寫的數據段(填充數據+只讀數據)
在這裏插入圖片描述
**小結:**所以從內存分佈可以看見,這個32位文件的數據段起始位置其實是0x08049000的,
主要包含:填充區域 + 只讀數據 + 讀寫數據 + 填充區域

擴充:64位ELF可執行文件

下面是64位文件的文件格式:

  • text段、data段是200000對齊的。
  • text段在內存空間可以用的區域:0x400000-0x600000
  • data段在內存空間可以用的區域:0x600000-0x800000
  • data段和text段在內存空間裏,中間有0x1000大小的只讀數據區域
    在這裏插入圖片描述
    在這裏插入圖片描述

小結

可以看到32、64位ELF文件text段和data段中間的有很多填充區域,都可以作爲病毒體的存儲位置

參考

elf官方規範: http://refspecs.linuxbase.org/elf/elf.pdf
Linux/Unix環境中ELF格式病毒的分析 https://www2.isye.gatech.edu/~yxie77/computer_engineering.pdf
[3]Acronyms relevant to Executable and Linkable Format (ELF) https://www.cs.stevens.edu/~jschauma/631/elf.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章