SHELLCODE呼叫方法

2021-04-03 00:05:17 字數 1807 閱讀 1177

editer:a**_c

給菜鳥看的,高手和愛說閒話的別看_:)

一直以來,都在看別人寫的shellcode,大概的程式我舉例如下;

char sc=

"/x99/x52/x58/x52/xbf/xb7/x97/x39/x34/x01/xff/x57/xbf/x97/x17/xb1"

"/x34/x01/xff/x47/x57/x89/xe3/x52/x53/x89/xe1/xb0/x63/x2c/x58/x81"

"/xef/x62/xae/x61/x69/x57/xff/xd4";

int main()

宣告不是我寫的,我也寫不出這樣的東西來,這個是乙個**安全人員寫的40位元組的shellcode,我要說的是這裡:

int (*f)() = (int (*)())sc;我當初看它,怎麼也看不懂,其實很簡單的:

摘抄:函式存放在記憶體的**區域內,它們同樣有位址,我們如何能獲得函式的位址呢?

如果我們有乙個int test(int a)的函式,那麼,它的位址就是函式的名字,這一點如同陣列一樣,陣列的名字就是陣列的起始位址。

定義乙個指向函式的指標用如下的形式,以上面的test()為例:

int (*fp)(int a);//這裡就定義了乙個指向函式的指標

函式指標不能絕對不能指向不同型別,或者是帶不同形參的函式,在定義函式指標的時候我們很容易犯如下的錯誤。

int *fp(int a);//這裡是錯誤的,因為按照結合性和優先順序來看就是先和()結合,然後變成了乙個返回整形指標的函式了,而不是函式指標,這一點尤其需要注意!

下面我們來看乙個具體的例子:

#include

#include

using namespace std;  

int test(int a);  

void main(int argc,char* argv)    

void t2()  

void t3()  

void main(int argc,char* argv)      

;  cout<<"比較t1()的記憶體位址和陣列a[0]所儲存的位址是否一致"<

cout<

typedef void (*fp)();//自定義乙個函式指標型別  

fp b=; //利用自定義型別fp把b定義趁乙個指向函式的指標陣列  

b[0]();//現在利用指向函式的指標陣列進行下標操作就可以進行函式的間接呼叫了;  

cin.get();  

} 仔細看上面的例子可能不用我多說大家也會知道是怎麼一會事情了,最後我們做乙個重點小結,只要記住這一點,對於理解利用函式指標構成陣列進行函式間接呼叫就很容易了!

void* a=;

cout<<"比較t1()的記憶體位址和陣列a[0]所儲存的位址是否一致"<

cout<

上面的這一小段中的錯誤行,為什麼不能這麼呼叫呢?

前一篇教程我們已經說的很清楚了,不過在這裡我們還是複習一下概念,指標陣列元素所儲存的只是乙個記憶體位址,既然只是個記憶體位址就不可能進行a[0]()這樣位址帶括號的操作,而函式指標不同它是乙個例外,函式指標只所以這麼叫它就是因為它是指向函式指向記憶體的**區的指標,它被系統授予允許與()括號操作的權利,進行間接的函式呼叫,既然函式指標允許這麼操作,那麼被定義成函式指標的陣列就一定是可以一樣的操作.

看到這裡菜鳥朋友是不是明白了許多,以後可以自己測試shellcode了...

Shellcode技術雜談

shellcode是溢位程式和蠕蟲病毒的核心,提到它自然就會和漏洞聯想在一起,畢竟shellcode只對沒有打補丁的 主機有用武之地。網路上數以萬計帶著漏洞頑強執行著的伺服器給hacker和vxer豐盛的晚餐。漏洞利用中最關鍵的是 shellcode的編寫。由於漏洞發現者在漏洞發現之初並不會給出完整...

Shellcode技術雜談

shellcode是溢位程式和蠕蟲病毒的核心,提到它自然就會和漏洞聯想在一起,畢竟shellcode只對沒有打補丁的 主機有用武之地。網路上數以萬計帶著漏洞頑強執行著的伺服器給hacker和vxer豐盛的晚餐。漏洞利用中最關鍵的是 shellcode的編寫。由於漏洞發現者在漏洞發現之初並不會給出完整...

Windows平台shellcode開發入門(一)

本文簡要介紹shellcode開發技術及其特點。理解這些概念可以有助於我們編寫自己的shellcode。更進一步講,你可以修改現有的漏洞利用 來執行自己所需要的定製功能。一 介紹 比方說你手頭上有乙個ie或flash playerd現成的漏洞利用 但它只能夠開啟計算器calc.exe。但是這實際上並...