프로그램이 사용하는 스택 영역은 스레드가 생성되는 단계에서 만들어진다.
[ 초기 ]
high
... |
... |
Committed Page |
Guard Protection Page |
Reserved Page |
... |
... |
low
[*] 윈도우즈에서는 스레드 생성시 디폴트로 1MByte의 메모리를 Reserved Page로 놓는다.
여기서 1개의 페이지(4KByte)만을 실제 메모리와 매핑된 Committed Page로 두고 그 다음 페이지를 Guard Page로 놓는다.
[ 늘어나는 Committed Page ]
high
... |
... |
Committed Page |
Guard Protection Page |
Reserved Page |
... |
... |
low
[*] 스택을 사용하여 스레드가 Committed Page를 초과하여 사용할 때 Guard Page에 접근하게 되고 이 때 Guard Page를 Committed Page로 바꿔주며 Guard Page는 한 페이지 아래로 내려간다.
- 동작 원리는 Guard Page에 접근하게되면 페이지 폴트가 발생하고 해당 메모리가 스택 영역이였다면 ZwAllocateVirtualMemory를 호출하여 4KB를 할당해준다. 또 TIB의 StackLimit 값을 4KB 증가시킴으로써 현재까지 Commit된 스택 사이즈를 증가시켜준다.
[마지막 부분]
high
... |
... |
Committed Page |
Reserved Page |
... |
... |
[*] 마지막 페이지는 Guard Page가 내려오더라도 예약된 스택 영역을 벗어나지 않게 하기 위해서 항상 Reserved Page로 둔다.
ref - Windows 구조와 원리 (OS를 관통하는 프로그래밍의 원리)
'System > Windows' 카테고리의 다른 글
[CVE-2012-4792] (0) | 2014.08.15 |
---|---|
pydbg로 Fuzzer 만들기 (0) | 2014.04.27 |
FileFuzz, Peach Fuzzer 링크 (0) | 2013.11.12 |
메모리 보호 기법 DEP/NX (1) | 2012.09.05 |
windows bof [basic stack overflow] (2) | 2012.04.08 |