日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Unix/ELF文件格式及病毒分析

瀏覽:315日期:2024-06-29 16:12:38

★ 介紹

本文介紹了Unix病毒機制、具體實現以及ELF文件格式。簡述了Unix病毒檢測和反檢 測技術,提供了Linux/i386架構下的一些例子。需要一些初步的Unix編程經驗,能夠 理解Linux/i386下匯編語言,如果理解ELF本身更好。

本文沒有任何實際意義上的病毒編程技術,僅僅是把病毒原理應用到Unix環境下。這 里也不打算從頭介紹ELF規范,感興趣的讀者請自行閱讀ELF規范。

★ 感染 ELF 格式文件

進程映象包含'文本段'和'數據段',文本段的內存保護屬性是r-x,因此一般自修改 代碼不能用于文本段。數據段的內存保護屬性是rw-。

段并不要求是頁尺寸的整數倍,這里用到了填充。

關鍵字:

[...] 一個完整的頁 M 已經使用了的內存 P 填充

頁號 #1 [PPPPMMMMMMMMMMMM] #2 [MMMMMMMMMMMMMMMM] |-- 一個段 #3 [MMMMMMMMMMMMPPPP] /

段并沒有限制一定使用多個頁,因此單頁的段是允許的。

頁號 #1 [PPPPMMMMMMMMPPPP] <-- 一個段

典型的,數據段不需要從頁邊界開始,而文本段要求起始頁邊界對齊,一個進程映象 的內存布局可能如下:

關鍵字:

[...] 一個完整的頁 T 文本段內容 D 數據段內容 P 填充

頁號 #1 [TTTTTTTTTTTTTTTT] <-- 文本段內容 #2 [TTTTTTTTTTTTTTTT] <-- 文本段內容 #3 [TTTTTTTTTTTTPPPP] <-- 文本段內容(部分) #4 [PPPPDDDDDDDDDDDD] <-- 數據段內容(部分) #5 [DDDDDDDDDDDDDDDD] <-- 數據段內容 #6 [DDDDDDDDDDDDPPPP] <-- 數據段內容(部分)

頁1、2、3組成了文本段 頁4、5、6組成了數據段

從現在開始,為簡便起見,段描述圖表用單頁,如下:

頁號 #1 [TTTTTTTTTTTTPPPP] <-- 文本段 #2 [PPPPDDDDDDDDPPPP] <-- 數據段

在i386下,堆棧段總是在數據段被給予足夠空間之后才定位的,一般堆棧位于內存高 端,它是向低端增長的。

在ELF文件中,可裝載段都是物理映象:

ELF Header . . Segment 1 <-- 文本段 Segment 2 <-- 數據段 . .

每個段都有一個定位自身起始位置的虛擬地址。可以在代碼中使用這個地址。

為了插入寄生代碼,必須保證原來的代碼不被破壞,因此需要擴展相應段所需內存。

文本段事實上不僅僅包含代碼,還有 ELF 頭,其中包含動態鏈接信息等等。如果直 接擴展文本段插入寄生代碼,帶來的問題很多,比如引用絕對地址等問題。可以考慮 保持文本段不變,額外增加一個段存放寄生代碼。然而引入一個額外的段的確容易引 起懷疑,很容易被發現。

向高端擴展文本段或者向低端擴展數據段都有可能引起段重疊,在內存中重定位一個 段又會使那些引用了絕對地址的代碼產生問題。可以考慮向高端擴展數據段,這不是 個好主意,有些Unix完整地實現了內存保護機制,數據段是不可執行的。

段邊界上的頁填充提供了插入寄生代碼的地方,只要空間允許。在這里插入寄生代碼 不破壞原有段內容,不要求重定位。文本段結尾處的頁填充是個很好的地方,最后看 上去象下面這個樣子:

關鍵字:

[...] 一個完整的頁 V 寄生代碼 T 文本段內容 D 數據段內容 P 填充

頁號 #1 [TTTTTTTTTTTTVVPP] <-- 文本段 #2 [PPPPDDDDDDDDPPPP] <-- 數據段

一個更完整的ELF可執行布局如下:

ELF Header Program header table Segment 1 Segment 2 Section header table Section 1 . . Section n

典型的,額外的節(那些沒有相應段的節)用于存放調試信息、符號表等等。

下面是一些來自 ELF 規范的內容:

ELF 頭位于最開始,保存一張'road map',描述了文件的組織結構。節保存大量鏈接 信息、符號表、重定位信息等等。

如果存在一個'program header table',將告訴操作系統如何建立進程映象(執行一 個程序)。可執行文件必須有一個'program header table',可重定位的文件不需要 該表。'section header table'描述了文件的節組織。每個節在該表中都有一個表項, 表項包含了諸如節名、節尺寸等信息。鏈接過程中被用到的文件自身必須有一個 'section header table',其他目標文件可有可無該表。

插入寄生代碼之后,ELF 文件布局如下:

ELF Header Program header table Segment 1 - 文本段(主體代碼) - 寄生代碼 Segment 2 Section header table Section 1 . . Section n

寄生代碼必須物理插入到ELF文件中,文本段必須擴展以包含新代碼。

下面的信息來自/usr/include/elf.h

/* The ELF file header. This appears at the start of every ELF file. */

#define EI_NIDENT (16)

typedef struct { unsigned char e_ident[EI_NIDENT]; /* Magic number and other info */ Elf32_Half e_type; /* Object file type */ Elf32_Half e_Machine; /* Architecture */ Elf32_Word e_version; /* Object file version */ Elf32_Addr e_entry; /* Entry point virtual address */ Elf32_Off e_phoff; /* Program header table file offset */ Elf32_Off e_shoff; /* Section header table file offset */ Elf32_Word e_flags; /* Processor-specific flags */ Elf32_Half e_ehsize; /* ELF header size in bytes */ Elf32_Half e_phentsize; /* Program header table entry size */ Elf32_Half e_phnum; /* Program header table entry count */ Elf32_Half e_shentsize; /* Section header table entry size */ Elf32_Half e_shnum; /* Section header table entry count */ Elf32_Half e_shstrndx; /* Section header string table index */ } Elf32_Ehdr;

e_entry 保存了程序入口點的虛擬地址。

e_phoff 是'program header table'在文件中的偏移。因此為了讀取 'program header table',需要調用lseek()定位該表。

e_shoff 是'section header table'在文件中的偏移。該表位于文件尾部,在文本段 尾部插入寄生代碼之后,必須更新e_shoff指向新的偏移。

/* Program segment header. */

typedef struct { Elf32_Word p_type; /* Segment type */ Elf32_Off p_offset; /* Segment file offset */ Elf32_Addr p_vaddr; /* Segment virtual address */ Elf32_Addr p_paddr; /* Segment physical address */ Elf32_Word p_filesz; /* Segment size in file */ Elf32_Word p_memsz; /* Segment size in memory */ Elf32_Word p_flags; /* Segment flags */ Elf32_Word p_align; /* Segment alignment */ } Elf32_Phdr;

可裝載段(文本段/數據段)在'program header'中由成員變量p_type標識出是可裝載 的,其值為PT_LOAD (1)。與'ELF header'中的e_shoff一樣,這里的p_offset成員 必須在插入寄生代碼后更新以指向新偏移。

p_vaddr 指定了段的起始虛擬地址。以p_vaddr為基地址,重新計算e_entry,就可以 指定程序流從何處開始。

可以利用p_vaddr指定程序流從何處開始。

p_filesz 和 p_memsz 分別對應該段占用的文件尺寸和內存尺寸。

.bss 節對應數據段里未初始化的數據部分。我們不想讓未初始化的數據占用文件空 間,但是進程映象必須保證能夠分配足夠的內存空間。.bss 節位于數據段尾部,任 何超過文件尺寸的定位都假設位于該節中。

/* Section header. */

typedef struct { Elf32_Word sh_name; /* Section name (string tbl index) */ Elf32_Word sh_type; /* Section type */ Elf32_Word sh_flags; /* Section flags */ Elf32_Addr sh_addr; /* Section virtual addr at execution */ Elf32_Off sh_offset; /* Section file offset */ Elf32_Word sh_size; /* Section size in bytes */ Elf32_Word sh_link; /* Link to another section */ Elf32_Word sh_info; /* Additional section information */ Elf32_Word sh_addralign; /* Section alignment */ Elf32_Word sh_entsize; /* Entry size if section holds table */ } Elf32_Shdr;

sh_offset 指定了節在文件中的偏移。

為了在文本段末尾插入寄生代碼,我們必須做下列事情:

* 修正'ELF header'中的 p_shoff * 定位'text segment program header' * 修正 p_filesz * 修正 p_memsz * 對于文本段phdr之后的其他phdr * 修正 p_offset * 對于那些因插入寄生代碼影響偏移的每節的shdr * 修正 sh_offset * 在文件中物理地插入寄生代碼到這個位置 text segment p_offset + p_filesz (original)

這里存在一個大問題,ELF 規范中指出,

p_vaddr mod PAGE_SIZE == p_offset mod PAGE_SIZE

為了滿足這個要求:

* 修正'ELF header'中的 p_shoff ,增加 PAGE_SIZE 大小 * 定位'text segment program header' * 修正 p_filesz * 修正 p_memsz * 對于文本段phdr之后的其他phdr * 修正 p_offset ,增加 PAGE_SIZE 大小 * 對于那些因插入寄生代碼影響偏移的每節的shdr * 修正 sh_offset ,增加 PAGE_SIZE 大小 * 在文件中物理地插入寄生代碼以及填充(確保構成一個完整頁)到這個位置 text segment p_offset + p_filesz (original)

我們還需要修正程序入口點的虛擬地址,使得寄生代碼先于宿主代碼執行。同時需要 在寄生代碼尾部能夠跳轉回宿主代碼原入口點繼續正常流程。

* 修正'ELF header'中的 p_shoff ,增加 PAGE_SIZE 大小 * 修正寄生代碼的尾部,使之能夠跳轉回宿主代碼原入口點 * 定位'text segment program header' * 修正 'ELF header'中的 e_entry ,指向 p_vaddr + p_filesz * 修正 p_filesz * 修正 p_memsz * 對于文本段phdr之后的其他phdr * 修正 p_offset ,增加 PAGE_SIZE 大小 * 對于文本段的最后一個shdr * 修正sh_len(應該是sh_size吧,不確定),增加寄生代碼大小 * 對于那些因插入寄生代碼影響偏移的每節的shdr * 修正 sh_offset ,增加 PAGE_SIZE 大小 * 在文件中物理地插入寄生代碼以及填充(確保構成一個完整頁)到這個位置 text segment p_offset + p_filesz (original)

病毒可以隨機遍歷一個目錄樹,尋找那些e_type等于 ET_EXEC 或者 ET_DYN 的文件, 加以感染,這分別是可執行文件和動態鏈接庫文件。

★ 分析Linux病毒

病毒要求不使用庫,避開libc,轉而使用系統調用機制。 為了動態申請堆內存用于phdr table和shdr table,應該使用brk系統調用。 利用與緩沖區溢出相同的技術取得常量字符串的地址。

使用gcc -S編譯c代碼,觀察調整asm代碼。 注意在進入/離開寄生代碼的時候保存/恢復寄存器。

利用objdump -D觀察調整一些需要確定的偏移量。

★ 檢測病毒

這里描述的病毒很容易檢測。最顯眼的是程序入口點不在常規節中,甚至干脆不在任 何節中。清理病毒的過程和感染病毒的過程類似。

用objdump --all-headers很容易定位程序入口點,用objdump --disassemble-all 跟蹤下去就可以得到程序原入口點。

缺省程序入口點是_start,但是可以在鏈接的時候更改它。

★ 結論

Unix病毒盡管不流行,但的確可行。

標簽: Unix系統
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
在线人成日本视频| 精品一区三区| 欧美久久亚洲| 国产精品黑丝在线播放| 久久久久久久久久久9不雅视频| а√在线中文在线新版| 成人在线观看免费视频| 日韩免费久久| 国模 一区 二区 三区| 国产一区精品福利| 日韩一区二区中文| 亚洲激情欧美| 日韩国产91| 日韩一区二区在线免费| 五月天久久777| 视频一区视频二区中文字幕| 成人国产精品久久| 日韩欧美中文字幕在线视频| 亚洲天堂资源| 国产精品一站二站| 蜜臀va亚洲va欧美va天堂 | 久久久精品久久久久久96| 一区二区视频欧美| 韩日一区二区| 日韩和欧美一区二区| 久久亚洲国产| 美腿丝袜在线亚洲一区| 亚洲精选91| 欧美日韩精品一区二区视频| 日韩av资源网| 99国产精品99久久久久久粉嫩| 久久精品国产亚洲一区二区三区| 日韩欧美美女在线观看| 日韩午夜在线| 老牛国内精品亚洲成av人片 | 欧美国产小视频| 91成人小视频| 亚洲在线观看| 激情偷拍久久| 中文字幕一区久| 久久精品国内一区二区三区| 久久国产精品美女| 加勒比视频一区| 久久最新视频| 黄色日韩精品| 五月天激情综合网| 中文字幕在线看片| 亚洲黄色免费看| 水蜜桃精品av一区二区| 日韩欧美激情电影| 婷婷精品进入| 九九色在线视频| 黄毛片在线观看| 久久免费精品| 粉嫩av一区二区三区四区五区| 国产精品免费大片| 国产精品欧美一区二区三区不卡| 亚洲91在线| 亚洲欧洲日韩精品在线| 另类国产ts人妖高潮视频| 夜久久久久久| 亚洲欧美日本视频在线观看| 伊人久久亚洲热| 日韩一区二区免费看| 一区二区三区国产盗摄| 久久午夜视频| 中文字幕亚洲精品乱码| 欧美在线日韩| 日韩欧美中文在线观看| 日韩欧美精品一区二区综合视频| 亚洲人成在线影院| 日韩国产欧美在线播放| 青青国产91久久久久久| 亚洲精选91| 国产日产高清欧美一区二区三区 | 日本欧美大码aⅴ在线播放| 久久亚洲美女| 日韩中文字幕在线一区| 欧美日韩亚洲一区三区| 久久精品99国产精品日本| 美女精品久久| 视频一区二区三区中文字幕| 欧美激情一区| 精品一区二区三区中文字幕视频| 国产 日韩 欧美 综合 一区| 国产极品模特精品一二| 国产精品777777在线播放| 美女久久久精品| 日韩欧美二区| 麻豆国产精品| 久久一级电影| 悠悠资源网久久精品| 日韩欧美激情电影| 美女视频网站久久| 久久精品在线| 日韩中文字幕视频网| 久久女人天堂| 婷婷亚洲综合| 亚洲精品激情| 福利一区和二区| 亚洲调教视频在线观看| 蜜桃一区二区三区在线| 国产毛片精品| 欧美日韩中文一区二区| **爰片久久毛片| 久久香蕉国产| 久久精品97| 免费视频一区三区| 国产精品白丝av嫩草影院| 天堂日韩电影| 国产亚洲精品美女久久| 蜜臀av免费一区二区三区| 欧美日韩一区二区三区在线电影| 999久久久精品国产| 国产私拍福利精品视频二区| а√在线中文在线新版| 男人的天堂久久精品| 国产精品一线天粉嫩av| 免费黄色成人| 精品91福利视频| 日韩精品亚洲一区二区三区免费| а√天堂8资源在线| 国产精品色在线网站| 免费久久99精品国产| 久久久久99| 黑森林国产精品av| 国产精品a久久久久| 午夜性色一区二区三区免费视频| 99精品在线| 鲁大师精品99久久久| 欧美午夜不卡| 精品淫伦v久久水蜜桃| 亚洲一级大片| 99视频精品| 亚洲一本视频| 久久久久久黄| 青青久久av| 麻豆传媒一区二区三区| 国产精品成人一区二区网站软件| 日本高清不卡一区二区三区视频| 国产欧美日韩影院| 久久精品xxxxx| 国产精品va| 荡女精品导航| 久久精品国产在热久久| 国产欧美日韩在线观看视频| 欧美亚洲自偷自偷| 日韩成人午夜精品| 日本在线观看不卡视频| 日韩成人一级| 欧美激情五月| jizzjizz中国精品麻豆| 日韩高清中文字幕一区二区| 久久亚洲专区| 91久久中文| 日韩精品免费视频人成| 国产探花在线精品| 精品国产欧美日韩| 日韩高清成人| 亚洲精品网址| 精品视频高潮| 麻豆亚洲精品| 国产成人久久精品一区二区三区| 亚州av乱码久久精品蜜桃| 国产欧美高清| 红桃视频国产一区| 国产日韩一区二区三区在线播放| 99久久精品费精品国产| 国产日产精品_国产精品毛片| 久久婷婷丁香| 麻豆久久一区| 亚洲精品国模| 91国语精品自产拍| 国产在线观看91一区二区三区| 亚洲精品麻豆| 视频小说一区二区| 久久不见久久见国语| 亚洲精品影视| 91国语精品自产拍| 国产精品久久久久久久免费观看 | 国产精品最新自拍| 丝袜美腿成人在线| 欧美1区免费| 亚洲四虎影院| 国产精品v一区二区三区| 亚洲毛片在线免费| 亚洲免费精品| 999国产精品999久久久久久| 国产一区二区三区国产精品| 欧美日韩亚洲一区三区| 日本午夜精品久久久久| 亚洲ww精品| 国产欧美视频在线| 国产精品丝袜在线播放| 国产精品久久久久9999高清| 91精品国产经典在线观看| 欧美日韩亚洲一区三区| 欧美在线91| 精品一区91| 麻豆精品在线观看|