一片部、虛擬內存
在早期的操作系統(tǒng)中沒有虛擬內存的概念,叫做物理地址。大概如下:
這個時候會將整個應用程序加載到內存肋拔,當內存不夠用的時候需要關閉應用程序才能打開新的應用程序。
隨著軟件的發(fā)展速度遠快于硬件呀酸,就存在一個問題 內存不夠用凉蜂。還有一個問題是如果用物理內存還有 安全問題(可以跨進程訪問別的應用程序數(shù)據(jù))。
當然我們現(xiàn)在都是虛擬內存性誉,那么怎么驗證呢窿吩?
很簡單,我們用Xcode
跑兩個工程错览。在一個工程中找到一個內存地址纫雁,在另外一個工程中修改,然后再回到第一個工程看對應內存地址數(shù)據(jù)有沒有變化就能驗證了倾哺。
這個時候出現(xiàn)了內存映射表(頁表轧邪,iOS
中地址空間4G
,實際不會讓你用完4G
):
內存映射表將應用程序和物理內存完全阻隔開羞海,應用程序訪問的虛擬內存相同忌愚,但是映射到物理內存是不同的地址。
之前的物理內存訪問存在兩個問題:
- 安全問題:能訪問別人的進程扣猫。
- 內存不夠用的問題。
通過頁表可以解決安全問題翘地,那么內存不夠用是怎么解決的呢申尤?
早期物理內存是將整個應用程序全部加載到內存癌幕,但是用戶并不會用到軟件的全部功能,很大一部分數(shù)據(jù)是沒有用到的昧穿。
如果內存映射表以字節(jié)為單位那么表會非常大勺远。這個時候就出現(xiàn)了內存分頁管理(iOS一頁16kb
)。
應用程序讀取第一頁的數(shù)據(jù)时鸵,虛擬頁表發(fā)現(xiàn)物理內存中沒有數(shù)據(jù)則去加載數(shù)據(jù)(這個時候觸發(fā)中斷
pagefault
)胶逢。如果已經加載則通過地址翻譯(MMU
)去找物理內存。這個時候物理內存是隨機分配的(解決了安全問題)饰潜,并且應用程序只是用到的部分加載(內存不夠用解決)初坠。如果物理內存滿了則數(shù)據(jù)會被加載到最不活躍的地址去覆蓋數(shù)據(jù)。
Apple
在物理內存中分配了一塊空間(需要申請)彭雾,不在特殊情況不會被覆蓋碟刺。這樣就實現(xiàn)了保活薯酝。比如音樂播放等半沽。
那么加了頁表需要查找物理內存會不會影響效率呢?
頁表查找物理內存是通過CPU
上的硬件MMU
(地址翻譯)完成的吴菠,并且CPU
上有高速緩存對查找結果進行緩存者填。真正影響效率的地方是缺頁中斷(pagefault
),不過這個用戶也感知不到做葵。
這也就是二進制重排的原理占哟,減少缺頁中斷。
二蜂挪、ASLR
ASLR
(Address space layout randomization
)是一種針對緩沖區(qū)溢出的安全保護技術重挑,通過對堆、棧棠涮、共享庫映射等線性區(qū)布局的隨機化谬哀,通過增加攻擊者預測目的地址的難度,防止攻擊者直接定位攻擊代碼位置严肪,達到阻止溢出攻擊的目的史煎。
目前大部分主流的操作系統(tǒng)已經實現(xiàn)了ASLR
。
- Linux
Linux
已在內核版本2.6.12
中添加ASLR
驳糯。 - Windows
Windows Server 2008
篇梭,Windows 7
,Windows Vista
酝枢,Windows Server 2008 R2
默認情況下啟用ASLR
恬偷,但它僅適用于動態(tài)鏈接庫和可執(zhí)行文件。 - Mac OS X
Apple
在Mac OS X Leopard10.5
(2007年10月發(fā)行)中某些庫導入了隨機地址偏移帘睦,但其實現(xiàn)并沒有提供ASLR
所定義的完整保護能力袍患。而Mac OS X Lion10.7
則對所有的應用程序均提供了ASLR
支持坦康。Apple
宣稱為應用程序改善了這項技術的支持,能讓32
及64
位的應用程序避開更多此類攻擊诡延。從OS X Mountain Lion10.8
開始滞欠,核心及核心擴充(kext
)與zones
在系統(tǒng)啟動時也會隨機配置。 - iOS(iPhone, iPod touch, iPad)
Apple
在iOS4.3
內導入了ASLR
肆良。 - Android
Android 4.0
提供地址空間配置隨機加載(ASLR
)筛璧,以幫助保護系統(tǒng)和第三方應用程序免受由于內存管理問題的攻擊,在Android 4.1
中加入地址無關代碼(position-independent code
)的支持惹恃。
以前應用程序直接加載到物理內存中每次地址是隨機的夭谤。虛擬內存每次地址都是從0
開始的。那么虛擬內存就固定了座舍,直接注入惡意程序就能直接訪問了沮翔。這個時候就出現(xiàn)了ASLR
。模擬了物理內存每次隨機分配曲秉。
在上圖中
文件偏移地址
file offset
:0x1a70
采蚀。虛擬內存地址
VM Address
:0x100001a70
。運行虛擬內存地址:
ASLR
+ VM Address
承二。
總結
- 虛擬內存
- 所有程序的內存訪問都是通過虛擬地址訪問的榆鼠。
- 每個應用程序有一張頁表,虛擬地址和物理地址的映射表亥鸠。
- 數(shù)據(jù)加載以頁為單位加載妆够。
- ASLR
- 一種保護技術,在每次加載應用的時候系統(tǒng)給一個隨機的偏移值负蚊。所以需要
rebase
神妹。 - 定位方法地址,下內存斷點
- 1家妆、LLDB:image list 找到MachO首地址鸵荠。
- 2、找到方法在文件中的虛擬地址伤极、文件中的偏移地址蛹找。
- 3、獲取到方法的虛擬地址
- 3.1哨坪、MachO首地址 + 文件中的偏移地址
- 3.2庸疾、MachO中的虛擬地址 + ASLR
- 一種保護技術,在每次加載應用的時候系統(tǒng)給一個隨機的偏移值负蚊。所以需要