例如我們在Windows XP平臺上,我們在ollydbg上有程序A,我們看看指令x。它具有地址0x11111111(例如)。如果我採取程序A並在具有相同平臺的不同計算機上的ollydbg中運行,則指令x將具有相同的地址0x11111111? 所以我的問題是:內存地址每次運行程序A時都會改變嗎?或者他們在不同的計算機或平臺上更換?內存尋址
Q
內存尋址
0
A
回答
0
取決於架構,但不應該依賴這些地址是相同的。爲了實際的目的,答案是否定的。
要回答你的評論,漏洞利用者必須找出它們的位置。這樣做的一個簡單的辦法是撥打電話並彈出返回地址,像這樣:
call test_eip
test_eip:
pop eax
在這種情況下,您將有指令指針eax
。這對於確定注入代碼的位置是有用的。
當然,你必須達到這個目標,主要是使用緩衝區溢出攻擊。
維基百科 - 一如既往 - 提供了一個很好的解釋和大量的鏈接到照顧:http://en.wikipedia.org/wiki/Stack_buffer_overflow
0
在有相同的可執行相同的操作系統版本,你可能會,但不肯定,看到相同的代碼地址。不同的操作系統版本不太可能。
1
你看到的是一個虛擬地址。 CPU包含只能被操作系統看到的特殊寄存器;這些寄存器控制虛擬內存到物理內存的映射。每當操作系統切換到不同的進程時,它都會對這些寄存器進行重新編程,以便程序認爲其內存始終處於相同的位置。
0
Windows PE二進制文件不是位置獨立的,這意味着它們需要假設一個固定的地址來執行。微軟這樣做是爲了提高執行性能(以加載時間懲罰爲代價)。
您的二進制文件將始終從其所需的位置執行,但是,如果其偏好地址已被其他代碼使用,則DLL可能會重新定位。
重新定位對您而言是透明的,Windows二進制裝載程序會修改您的代碼並修復所有地址,以便它們在新位置工作。
相關問題
- 1. PyCUDA內存尋址:內存偏移量?
- 2. 爲什麼字節尋址內存而不是4字節尋址內存?
- 3. 字節尋址內存(數據對齊)
- 4. 學習C - 指針和內存尋址
- 5. 什麼是統一尋址內存?
- 6. MIPS彙編中的內存尋址
- 7. 內容尋址網絡
- 8. 寄存器間接尋址
- 9. 寄存器尋址模式與直接尋址模式
- 10. 當最大內存不通電時,計算機如何處理內存尋址?
- 11. 虛擬內存的最大可尋址空間是多少?
- 12. 爲c結構數組尋址和分配內存
- 13. 4千字節內存中有多少個可尋址位?
- 14. Windows - 這種內存尋址是如何工作的?
- 15. 關於尋址內存,GDT的粒度位有什麼變化?
- 16. 關於實模式物理內存尋址
- 17. 瞭解裝配MIPS .ALIGN和內存尋址
- 18. 內存地址
- 19. Mac Pro 64位尋址內核
- 20. 內存管理[尋呼]
- 21. CUDA共享存儲器尋址
- 22. 直接映射緩存字節尋址
- 23. 直接存儲器尋址模式
- 24. 尋址存儲器中的數據
- 25. 尋址QTableWidget Colums
- 26. 相對尋址
- 27. 尋址用C
- 28. LUA表尋址
- 29. C++內存地址?
- 30. 機器內存地址的內存地址? (C語言)
非常感謝回答。 那麼exploit(基於緩衝區溢出)如何在shellcode的起始地址必須覆蓋返回地址並且我們不能依賴它們的堆棧上運行shellcode(假設沒有保護)。這怎麼可能?這是我不能得到的東西。 – nore 2010-12-09 23:08:09
是的,但問題是:如果我不重定向返回地址執行它,如何運行test_esp。我必須先知道一個地址。例如,我不能在遠程計算機上的漏洞程序中使用「gdb-it」。一個普遍的問題:衆所周知的漏洞利用工具是如何工作的。讓他們有一個返回地址的常量變量?我問得太多,但我認爲這是差距正在下降。我需要一個指導,但如果你能回答我,我會很感激。 ty再次 – nore 2010-12-09 23:32:41