본문 바로가기

힙 손상 탐지(2-2) - 힙 오버런, 언더런 (Full PageHeap) 힙 손상 탐지(2-2) - 힙 오버런, 언더런 (Full PageHeap)힙 손상 탐지(2-1) - 힙 오버런, 언더런 (Normal PageHeap) 를 먼저 읽고 보자. gflags를 이용한 풀 페이지힙 적용 방법gflags.exe /p /enable /full/p : 페이지 힙/enable : 특정 옵션을 킴/full : 풀 옵션으로~! [ 풀 페이지 힙 - 할당 ][시나리오]1) 0x30 크기만큼의 힙을 할당 / 해제.2) Full PageHeap 적용 후 windbg에서 분석 1) 0x30 크기의 힙을 요청에 성공하고2) EAX에 유저 영역 시작 주소를 반환 받았다. 명령어 : !address 할당받은 0x30크기의 힙을 !address로 봤더니 Heap이 아닌 PageHeap으로 뜨는 것을 볼..
FS 레지스터를 알아보자. FS 레지스터를 알아보자. FS 레지스터는 유저모드에서 현재 스레드의 TEB(Thread Environment Block)을 가리킨다.FS 레지스터는 커널모드에서는 일반적으로 KPCR(Kernel Process Control Region)을 가리킨다. 사용자 어플리케이션의 안티리버싱 기법을 정리하고자 FS레지스터를 짚고있으므로 유저모드 입장에서 다룬다. in windbgdt _TEB 명령어를 입력 ==> TEB 구조체 구조 확인 가능. FS레지스터가 TEB주소를 담는다면, FS:[0x30] == TEB.ProcessEnvirionmentBlock == PEB 주소 !teb: 현재 스레드의 요약정보 / TEB 주소(0x7efdd000)를 얻고, dt _TEB 7efdd000 : 현재 스레드의 TEB 구조체..
windbg 포인터 참조하기 WinDBG 포인터 참조하기 70634b48이라는 메모리 주소에 6e26a330이라는 값이 담겨있습니다. call dword ptr [eax+0Ch] 처럼 어셈블리 명령어에서는 내부의 값을 참조한다는 의미로 [] 대괄호가 사용됩니다.하지만 이를 그대로 메모리창 (Alt+5)에서 확인하려고 똑같이 대괄호를 쓰면 원하는 값이 나오지 않습니다. 어셈블리 명령어 그대로 [eax+0ch]를 입력해보겠습니다.그림에서 보듯이 eax+0ch 와 [eax+0ch] 출력 시 값이 같게 나옵니다. 메모리창에서도 마찬가지구요. 어셈블리에서 쓰이는 값참조의 의미가 아닌 수식을 위한 괄호로 인식하기 때문입니다. 보다 정확하게 보자면 덧셈과 곱셈 연산에 괄호유무에 따라 값이 바뀌는 걸 확인할 수 있습니다. 어셈블리 명령어의 대괄호..
Trace 명령어 P : Step OverT : Step Into 기본적으로 p 또는 t 만 입력 시 현재 어셈블리 명령어 한줄만 실행한다. Windbg 명령어 동작 pa / ta 명시한 주소까지 Step Over / Step Into pc / tc 다음 call 명령까지 Step Over / Step Into pt / tt 다음 ret까지 Step Over / Step Into ph / th 다음 분기 명령까지 Step Over / Step Into pct / tch 다음 call 또는 ret까지 Step Over / Step Into