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...