2010-12-09 72 views
0

例如我們在Windows XP平臺上,我們在ollydbg上有程序A,我們看看指令x。它具有地址0x11111111(例如)。如果我採取程序A並在具有相同平臺的不同計算機上的ollydbg中運行,則指令x將具有相同的地址0x11111111? 所以我的問題是:內存地址每次運行程序A時都會改變嗎?或者他們在不同的計算機或平臺上更換?內存尋址

回答

0

取決於架構,但不應該依賴這些地址是相同的。爲了實際的目的,答案是否定的。

要回答你的評論,漏洞利用者必須找出它們的位置。這樣做的一個簡單的辦法是撥打電話並彈出返回地址,像這樣:

call test_eip 
test_eip: 
    pop eax 

在這種情況下,您將有指令指針eax。這對於確定注入代碼的位置是有用的。

當然,你必須達到這個目標,主要是使用緩衝區溢出攻擊。

維基百科 - 一如既往 - 提供了一個很好的解釋和大量的鏈接到照顧:http://en.wikipedia.org/wiki/Stack_buffer_overflow

+0

非常感謝回答。 那麼exploit(基於緩衝區溢出)如何在shellcode的起始地址必須覆蓋返回地址並且我們不能依賴它們的堆棧上運行shellcode(假設沒有保護)。這怎麼可能?這是我不能得到的東西。 – nore 2010-12-09 23:08:09

+0

是的,但問題是:如果我不重定向返回地址執行它,如何運行test_esp。我必須先知道一個地址。例如,我不能在遠程計算機上的漏洞程序中使用「gdb-it」。一個普遍的問題:衆所周知的漏洞利用工具是如何工作的。讓他們有一個返回地址的常量變量?我問得太多,但我認爲這是差距正在下降。我需要一個指導,但如果你能回答我,我會很感激。 ty再次 – nore 2010-12-09 23:32:41

0

在有相同的可執行相同的操作系統版本,你可能會,但不肯定,看到相同的代碼地址。不同的操作系統版本不太可能。

1

你看到的是一個虛擬地址。 CPU包含只能被操作系統看到的特殊寄存器;這些寄存器控制虛擬內存到物理內存的映射。每當操作系統切換到不同的進程時,它都會對這些寄存器進行重新編程,以便程序認爲其內存始終處於相同的位置。

0

Windows PE二進制文件不是位置獨立的,這意味着它們需要假設一個固定的地址來執行。微軟這樣做是爲了提高執行性能(以加載時間懲罰爲代價)。

您的二進制文件將始終從其所需的位置執行,但是,如果其偏好地址已被其他代碼使用,則DLL可能會重新定位。

重新定位對您而言是透明的,Windows二進制裝載程序會修改您的代碼並修復所有地址,以便它們在新位置工作。