Windows下生成shell的一種新方法

2021-04-02 02:57:59 字數 2649 閱讀 4147

shell實際上就是一小段可執行程式,有**段、資料段和堆疊。只不過這段程式在記憶體中的位置只有在程式執行時才能確定,而在編譯時並不能知道,這就給我們的程式設計帶來了不少麻煩,資料不好定位與賦值。unix下的jmp、call定位在我的vc上好像不太行;而資料的賦值一般用mov byte ptr[ebp-x],'?'來進行,既麻煩、又浪費間。另外要得到shell的**,還得用vc中的disassembly命令。那麼有沒有好一點的辦法呢?先看一下下面的程式: 

#include

#include

#include

void main() 

for(i=0;i>(8*i)); 

shell[4+i]=ch; 

} //初始化資料段 

data=shell+off; 

data[0]=0x01; 

.... 

//輸出shell 

file *fp; 

fp=fopen("shell","w"); 

fwrite(shell,off+?,1,fp); 

fclose(fp); 

return; 

//shell 

begin://shell開始 

__a** 

end://shell結束 

; } 

首先應該注意到,程式沒有執行完就return了,後面不被執行的地方就是我們要的shell**,程式一開始就用乙個buff指標指向這裡。然後就把buff中的內容移到乙個shell陣列中,這就是我們要的shell**段了。off是shell**段的大小,data=shell+off,即data指向shell**段之後,這就中資料段了,可以直接用data[x]=?對資料段進行初始化(是不是很方便?)。最後輸出shell陣列中的內容,就是完整的shell了,輸出的格式可以自己定義,這裡是以十六進製制格式直接輸出到乙個檔案中。 

上面是shell資料的初始化與shell的輸出。shell中資料段是如何定位的。大家看看不被執行的那一段匯程式設計序,mov ebp,esp,使ebp指向shell的**段(執行時)開始處。add ebp,0x11111111,使ebp的指標下移(0x11111111並不是最終值,這個0x11111111會前面的shell[4+i]=?處中被off覆蓋,4是0x11111111在shell中的偏移量),指向資料段(執行時)起始處。這下好了前面寫入data[x]中的資料,我們可以在shell中用[ebp+x]來訪問(也就是說shell與data形成了一一應的關係)。這裡直接用off覆蓋可能會產生0,我們可以把off與0xffffffff進行異或再覆蓋,當然在shell中也要異或一次。最後我們把上面的程式稍作改動,並定義成巨集。並把一些常用的操作也定義成巨集,如下: 

/*********shell.h*************/ 

/***程式框架的巨集************/ 

#define shelldata / 

void main()/ 

/ for(i=0;i>(8*i));/ 

shell[7+i]=(char)0xff-ch;/ 

}/ data=shell+codesize; 

#define shellcode/ 

return;/ 

begin:/ 

__a** mov ebp,0xffffffff/ 

__a** xor ebp,0x11111111/ 

__a** add ebp,esp 

#define shellend/ 

end:/ 

;/ } 

/***賦值用的巨集************/ 

#define string(id,str)/ 

strncpy(&data[id],str,strlen(str)+1);/ 

if(datasize>(8*i));/ 

data[id+i]=(char)ch;/ 

}/ if(datasize

#include

#include

#include "shell.h" 

shelldata 

//定義資料 

string(0,"abcdefg") 

int(8,25) 

char(12,'a') 

…… //輸出shell 

output(shell, codesize+datasize); 

shellcode 

__a** 

shellend 

接下來就是要找函式的api位址了,我們可以的loadlibrary和getprocaddress的入中位址放在data[0],data[4]中,以後可以直接使用call [ebp],call [ebp+4](call [ebp]會出現0,可用mov eax,ebp,call[eax]代替)。 

要找位址的函式名放在data陣列中,可從data[8]開始。函式名在找到位址後就沒有用了,就把找到的位址放在函式名的位置(把函式名覆蓋),這樣有乙個好處:可以直接根據函式名的位置訪問函式。 

資料段中的0要進行處理,我們可以在資料初始化之後,輸出之前進行加密(用c在程式中實現),在shell的開頭進行解密。這樣得到的shell中的字元是加過密的,執行時自動解密,不要再另行處理了,十分方便。 

由於本人對vc及巨集不太了解,上面的一些**並不合理,如invoke能不能用乙個巨集來寫,資料初始時能不能自動定位,這些都有待廣大讀者來解決。

windows下生成github ssh 公鑰

下面說下windows如何生成ssh公鑰 1.安裝git,從程式目錄開啟 git bash 或者直接用git shell,github自帶的工具 2.鍵入命令 ssh keygen t rsa c email email.com email email.com 是github賬號 3.提醒你輸入ke...

windows下生成https證書

2.安裝好openssl之後進入到openssl的安裝目錄下的bin目錄 3.執行一下命令,生成金鑰key 1 openssl genrsa des3 out f work server.key 2048 f work server.key 這個是生成的檔案路徑 這個命令執行的時候,會提示你輸入密碼...

windows環境下生成ssh keys

參考 1 首先你要安裝git工具 2 執行git bash here 3 輸入指令,進入.ss 件夾 cd ssh 如果提示 no such file or directory 你可以手動的建立乙個 ss 件夾即可 mkdir ssh4 配置全域性的name和email,這裡是的你github或者b...