2014-09-27 78 views
4

的,我已經看到了下面的例子:認識在shellcode的教程中的shellcode例如

main(){ 

    exit(0); 

} 

當時的想法是創建一個出口() - 系統調用。 這樣,那麼他們所生產的組件:

Section .text 

     global _start 

_start: 
     mov ebx, 0 
     mov eax, 1 
     int 0x80 

我明白這一點。 0是我們在ebx中存儲的exit()的參數,1是退出系統調用的編號,0x80我們將CPU更改爲內核模式並執行系統調用。

在那之後,他們讓生產這是該操作碼:

bb 00 00 00 00 
    b8 01 00 00 00 
    cd 80 

然後,他們翻譯成C語言,看起來像這樣:

char example[] = "\xbb\x00\x00\x00\x00" 
        "\xb8\x01\x00\x00\x00" 
        "\xcd\x80" 

    int main(){ 

    int *pointer; 
    pointer = (int *)&pointer+2; 
    (*pointer) = (int)example; 
    } 

所以,我的理解是,他們把操作碼放在char數組中,但我不明白他們在main()方法中做了什麼。 第一行是好的。但是他們想要在第二和第三行表達什麼?

此致

回答

1

的代碼採用堆棧變量的地址,然後它上面的地址的兩個指針的大小。 然後,無論在這個位置用shellcode的地址覆蓋。

如果被覆蓋的位置是函數的返回地址,那麼函數退出時,shellcode將被執行。實驗和反彙編可以幫助計算從本地變量到返回地址的正確偏移量。


一般情況下,實際利用會涉及到堆棧緩衝區溢出(即,不檢查一下它把它的棧緩衝區的長度,允許一個函數爲「溢出」到返回地址) :可以用shellcode填充緩衝區,「溢出」部分將包含緩衝區的地址;這樣,當函數退出時,它將在緩衝區內執行shellcode。

+0

只需輸入我自己的答案,並通知我,已經有一個.. – starrify 2014-09-27 15:35:44