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

  1. system find free page
  2. write your data into new page
  3. 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

results matching ""

    No results matching ""