2012-07-15 44 views
0

我有一個關於exploit_notesearch程序的問題。開發的藝術 - exploit_notesearch.c

該程序僅用於創建一個命令字符串,我們最終調用system()函數來利用包含緩衝區溢出漏洞的notesearch程序。 這些commandstr如下所示: ./notesearch Nop-block | shellcode |重複的ret(將跳入nop塊)。

現在的實際問題: 的RET-ADRESS在exploit_notesearch程序由線計算:

RET =(無符號整型)& I-偏移;

那麼,爲什麼我們使用我變量那是相當的exploit_notesearch程序的主的StackFrame底部的地址來計算RET地址將被保存在滿溢緩衝在notesearch程序本身,所以在一個完全不同的棧幀中,並且必須在nop塊中包含一個地址(它在同一個緩衝區中)。

回答

0

堆棧是以先入先出方式分配的。 i變量的位置在頂部的某個位置,假設它是0x200,並且返回地址位於較低地址0x180中,因此爲了確定要放置返回地址的位置,並且爲該位置留下了一些空間shellcode,攻擊者必須得到不同的地方,即:0x200 - 0x180 = 0x80(128),所以他會按如下方式將其分解,++,返回地址是4個字節,所以我們只有48個字節在到達之前離開分割。那就是它是如何計算的以及我給出的大致參考點的位置。

1

將在一個完全不同的StackFrame被保存在notesearch程序本身溢流緩衝器,所以

只要該系統使用虛擬存儲器,另一過程將由system()針對所創建的易受攻擊的程序,並且假設沒有堆棧隨機化,假設攻擊是在受攻擊的機器上編譯的(即易受攻擊的搜索機器上),兩個進程在啓動main()函數時將具有幾乎相同的值esp(以及offset) )。
選擇變量i的地址只是爲了給出關於幀基的位置的想法。我們可以使用它代替:

unsigned long sp(void)   // This is just a little function 
{ __asm__("movl %esp, %eax");} // used to return the stack pointer 

int main(){ 

esp = sp(); 
ret = esp - offset; 

//the rest part of main() 

} 

因爲變量i將位於相對恆定的距離esp,我們可以使用&i而不是esp,它並沒有多大關係。

如果系統沒有使用虛擬內存,那麼獲得ret的近似值會困難得多。