2012-05-28 77 views
1

據我所知,溢流開發需要三個步驟:堆溢出攻擊

1.Injecting任意代碼(shellcode的)轉換成目標進程的內存空間。

2.對eip進行控制。

3.設置eip執行任意代碼。

我閱讀本hawkens大約堆開發的文章,並瞭解有關如何ultimatly重載函數指針指向我的代碼一些戰術。

換句話說,我明白步驟2

我不明白的步驟1和3

  1. 如何注入我的代碼進程的內存空間?

  2. 在第3步我重寫了 指向我的shellcode的函數指針,我如何計算\知道的是我注入的代碼注入什麼地址 成? 。(此問題是通過使用「JMP ESP解決 在計算器)

回答

2

步驟1需要在攻擊代碼漏洞 常見vulnerabilites包括:

  • 緩衝器溢出(公共I C代碼,如果發生程序讀取的任意長字符串轉換爲固定的緩衝液)unsanitized數據(在SQL和腳本語言共同的
  • 評價,但在其他語言中,可能會發生以及)

步驟3需要詳細瞭解目標架構。

+0

我明白了。你可以給我一個關於如何在堆溢出的情況下找到shellcode地址的例子嗎? – Michael

+0

不,我沒有製造病毒的習慣,所以我從來沒有打擾過這樣做。 –

+0

網上有很多方法。例如,以 爲例。有時你無法精確地控制eip的位置,因此人們用覆蓋大量內存(搜索該詞)的「nop sleds」,希望當他們隨機切換內存時,他們將nop sled滑向下滑到利用。有時堆溢出(不只是溢出)會導致任意寫入4字節..(所以如果你知道堆棧地址,你可以覆蓋返回的eip)。與緩衝區溢出相比,堆棧漏洞利用有點牽涉其中。 – Dan

2

堆溢出,假設系統沒有啓用ASLR,你會知道你在溢出使用的內存塊(又名,緩衝區)的地址。

一種選擇是把給定的,可以控制緩衝器的內容(作爲應用程序的用戶)殼碼,其中所述緩衝液是,。一旦將shellcode字節放入緩衝區中,您只需跳轉到該緩衝區地址。

執行該跳轉的一種方法是,例如,通過覆蓋.dtors條目。一旦易受攻擊的程序結束,放在緩衝區中的shellcode將被執行。複雜的部分是.dtors覆蓋。爲此,您將不得不使用已發佈的堆開發技術。

的先決條件是該ASLR被去激活(知道緩衝器的執行脆弱程序之前的地址),並且其中所述緩衝液置於必須是可執行的存儲區域。

更多的事情,步驟2和步驟3是相同的。如果你控制eip,你會將它指向shellcode(任意代碼)。

P.S .:旁路ASLR更爲複雜。

1
  1. 如何將我的代碼注入進程空間?

    這是一個很有說服力的問題。它需要在所述進程空間中的「可利用的」代碼區域。例如,如果可能的話,Windows正在將大多數strcpy()重寫爲strncpy()。我說如果可能的話

    ,因爲不使用的strcpy的代碼的所有領域可以成功地轉換到strncpy()函數。爲什麼?因爲這個癥結所在的差異如下所示;

    strcpy($buffer, $copied); 
    

    strncpy($buffer, $copied, sizeof($copied)); 
    

    這是什麼使strncpy所以難以實現在現實世界中的場景。必須有安裝在大多數strncpy操作的「幻數」(sizeof運算()運算符創建這個神奇的數字)

    由於程序員我們使用硬編碼值教如嚴格遵守一個char buffer[1024];實在是太差了編碼練習。

    但是〜在比較 - 使用buffer[]="";buffer[1024]="";是利用的核心。但是,如果比如說我們這個代碼更改後,我們得到另一個漏洞引入系統...

    char * buffer; 
    char * copied; 
    
    strcpy(buffer, copied);//overflow this right here... 
    

    或本:

    int size = 1024; 
    
    char buffer[size]; 
    char copied[size]; 
    
    strncpy(buffer,copied, size); 
    

    這將會停止溢出,但引入了可利用的區域由於大小是可預測的並且被構造成1024個代碼/數據塊,所以在RAM中。

    因此,如果strcpy存在,那麼在程序的地址空間中尋找strcpy的原始海報將會使程序被利用。

    爲什麼strcpy被程序員青睞strncpy有很多原因。幻數,可變的輸入/輸出數據的大小...編程風格...等等...

  2. 怎麼辦,我發現自己在我的代碼(我的位置)

    檢查各種黑客書籍,這樣的例子〜

    但是,試試;

    label: 
    pop eax 
    pop eax 
    call pointer 
    
    jmp label 
    pointer: 
    mov esp, eax 
    jmp $ 
    

    這是一個例子非工作由於這樣的事實,我不想承擔責任寫入下一個Morris蠕蟲病毒!但是,任何體面的程序員都會得到這個代碼的jist,並立即知道我在這裏談論的是什麼。

    我希望你的溢流技術能在未來工作,我的兒子!