memory address space
最一開始是用二進位為單位, 所以是2的次方
now: 2^32 就是4G
windows給all process 4GB virtual memory in 32bit OS
thread in a process can access its own address space.
4GB被分為user(process information) & kernel(windows 用的空間) space各半
所以process實際能用的是2GB(virtual),
假如今天需要大量memory, 可以在Boot.ini裡面設定user space更大,同樣會壓縮到kernel space
[boot loader]
virtual address space
分四塊
(user space 64kb) null pointer assignment: help to detect null pointer, 避免pointer亂指, 會觸發accessviolation, MAX是 {}
(user space) user mode: process private space, can't touch others
(user space 64kb) 64 bit off limits: 防火牆避免接觸到kernel space
kernelspace : windows在用的,不得reading & writing, 每個process看到的kernel space一樣
win32 user memory map
(Stack)
BaseAddress
(Heap)
kernel mode
user mode max address為0x7fffffff, 在x86這個bit沒用到, 有些人會亂用不會有事
但x64會出問題!!!
/LargeAddressAware : 告訴windwos compiler你有存去最上面的bit, 則系統不會對他多做事情
3 way memory management
- memory mapped file api
- heap memory api
- virtualmemory api 這三個api會透過NT virtual memory mgr來存去記憶體
系統會在user space用一些東西,PEB/TEB之類的, TLS.....
可用virtual alloc來request, 可以指定特定位子的memory, 會保留
必要求follow Alloxation granularity(分配力度?)
分配力度: 要memory通常是一次拿到64kb, 不論你有沒有用完都會被保留這個大小
可以用api查系統會給你多少~~~
不過PEB TEB不遵守這個規定
https://msdn.microsoft.com/en-us/windows/hardware/drivers/gettingstarted/virtual-address-spaces
64bit的memory長得不一樣
https://msdn.microsoft.com/en-us/windows/hardware/drivers/gettingstarted/virtual-address-spaces
Heap
heap is link-list & tree structure.
Heap helps you allocate "SMALL" size memory
可以用malloc或new來要求位置, 兩者作用相同
malloc建議用在1mb以下
用VirtualAlloc > 1mb
優點: 是不用對其記憶體位址
缺點: 是比較慢,無法控制保證
Page
把 virtual address space分成好幾個單位
一個單位稱作page
"page狀態"
- free
- reserve
- committed: 表示有寫東西了, 也稱private
- sharable: 共享, 但只有一個process可以存取
"Reserve v.s Committing"
Reserve: 只做標記, 但沒有實際使用
Commit : 實際上佔住記憶體空間
可以看task mgr的Commit Size
"page action"
- paging: 把disk space看成記憶體的一部分, 這段space被稱為paging file.
- page fault: 表示資料在paging file內不再記憶體內, 需要去disk拿你的資料
"flow"
Address translation
Page table entry(PTE)會負責轉換virtual page address到physical address
詳閱恐龍本
page size
分為large page, small page
large page在轉address的時候比較快, 但記憶體容易有空洞, 也無法把裡面的東西轉到page file內, 而且東西會混再一起像是data & code放在一起, 會造成memory protection失效.
系統可能會禁用.small page內的東西可以轉到Page file
virtual alloc的大小通常是page size的倍數
Memory mapped file
把file分享給不同的process
優點: 檔案在記憶體共享, 不用走IO比較快, 也可同步IO
缺點: 記憶體的消耗, page fault長發生下就沒有優點了, 需要完整的記憶體空間
page attribute
When try to modify in Copy-On-Write
- system find free page
- write your data into new page
- mapping to new Page
memory protection
如果把data跟source code放在一起, 就會被有心人士試著把code塞在data區段
- safe structure exception handler(SAFESEH)
- OS會幫你加入"好的"exception handler來幫你處理
- 但有可能在系統幫你之前就被塞入東西, 導致SEH整個被overflow給蓋掉
- 所以後來OS又檢查是否會被改掉SEH
- 攻擊者誘騙了一次OS,讓他們以為SEH正常
- 後來OS又提出了DEP.....(data execution prevention) 不讓你執行stack內的東西
- ROP: 可繞過DEP, 執行記憶體中合法的程式(Gadget)碼來跑, 讓OS以為是正常的
- 利用padding一直加上gadget的片段, 一路塞到最後接到shellcode 也就是利用程式本身合法的片段跟參數, 去湊出自己要做的東西
- 於是OS發明出ASLR, 讓module的address每次都被打亂無法去湊出可以用的位子
- ASLR可以暴力的去被找出位子, 可以找到沒有被打亂的位子來使用
Data alignment
資料對其, 如果沒對其會跳exception
如果是要拉 跨page的資料, CPU就會須拉兩個page出來, 再重新找一個page把要的地方通通塞進去
x86的不會有事,但IA64會要你對其, 如果不想可以用__unaligned
推薦VMMap from Windoew internal