2011-07-02 59 views
1

這是脆弱的腳本:跳轉到與返回註冊到libc

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
int main(int argc, char *argv[]) 
{ 
char buffer[30]; 
strcpy(buffer, argv[1]); 
return 0; 
} 

我想利用這個腳本既ASLR和NX上。我打算使用ASLR的返回libc方法,並且我想知道是否可以跳轉到註冊技術來跳轉到一個庫。例如,如果庫的位置存儲在EAX中,我可以將返回地址指向「跳轉到EAX」的操作碼嗎?還是有其他方法可以同時繞開ASLR和NX?謝謝

+0

ASLR和NX的全部是防止這種事情。是什麼讓你覺得有一個微不足道的方法來規避它們? –

+0

在上面的代碼中,你有什麼方法可以獲得EAX的價值嗎?我沒有看到它...... –

回答

0

我以爲「回到libc」(或任何庫或程序代碼)被用來繞過NX。所以我相信你有這個倒退。

ASLR被用來做一個「返回libc」攻擊很多,更難以脫身。要繞過ASLR,你需要有一種方法來偵察庫位置,比如通過printf格式字符串漏洞,或者你需要運行你的漏洞數百次,直到你打到正確的隨機位置。

+0

實際上,對於當前的ASLR實現(它們仍然很弱),這不是真的。至少在Vista下(以及WIn7下的afaik),只有堆的開始是隨機的,所以如果我們可以分配足夠大的內存塊,那麼保護是微不足道的,以避免例如。 – Voo

+0

@Voo:這不僅僅適用於在大堆分配完成後按需加載庫嗎?如果所有庫都預先加載,它們都是隨機的。 –

+0

問題是隻有堆的開始是隨機化的(在vista afaik下最大偏移量爲2mb),這意味着如果我們能夠分配超過2mb的數據,某些數據將處於可預測的偏移量(例如寫入4mb的一個重複的數據模式) – Voo

0

那麼有一個操作碼調用(函數指針是以這種方式實現的),但這並沒有多大幫助(以及如何將地址放入eax首先是我的謎題 - 這就是不太可能,我認爲)

畢竟你仍然需要堆棧可執行(否則存儲操作碼就不會有太多的好處),並知道它的地址,以便你可以跳到它。有一些方法可以規避這些保護措施,但這並不容易 - 儘管我確信您可以通過一些Google搜索功能找到足夠的關於該主題的論文 - 但是如果您利用漏洞繞過ASLR和NX,則不需要返回libc攻擊已經存在,因爲你已經控制了系統。