리버싱의 바실리카(Basilica)

sharku.egloos.com



(II-d) i. IsDebuggerPresent

IsDebuggerPresent

 

Kernel32 IsDebuggerPresent 함수는 윈도우 95에서 소개되었습니다. 디버거가 실행중이면 TRUE 값을 반환합니다. 내부적으로 PEB->BeingDebugged 플래그에 의해 값을 반환합니다.

 

예제코드는 다음과 같습니다.

call IsDebuggerPresent

test al, al

jne being_debugged

 

일부 패커들은 커널32 IsDebuggerPresent() 함수를 사용하는 것을 피하며 직접 PEB구조체를 확인합니다.

 

예제 코드는 다음과 같습니다.

mov eax, fs:[30h] ;PEB

;check BeingDebugged

cmp b [eax+2], 0

jne being_debugged

 

이러한 방법을 해결하는 방법은 PEB->BeingDebugged 플래그 값을 FALSE로 설정하기만 하면 됩니다. 디버깅할 때 일반적으로 IsDebuggerPresent() 함수의 처음 instruction에 브레이크포인트를 설정한다. 몇몇의 언패커들은 반드시 브레이크 포인트를 확인합니다.

 

예제 코드는 다음과 같습니다.

push offset l1

call GetModuleHandleA

push offset l2

push eax

call GetProcAddress

cmp b [eax], 0cch

je being_debugged

...

l1: db "kernel32", 0

l2: db "IsDebuggerPresent", 0

 

일부 패커들은 함수의 첫 번째 바이트는 0x64라는 것을 확인합니다.(앞글자 "FS:")

 

예제 코드는 다음과 같습니다.

push offset l1

call GetModuleHandleA

push offset l2

push eax

call GetProcAddress

cmp b [eax], 64h

jne being_debugged

...

l1: db "kernel32", 0

l2: db "IsDebuggerPresent", 0

(II-c) The Heap (힙)

힙을 단순하게 정리하는 것과 같은 문제는 플래그들이 활성화 되었을 때 초기의 힙이 초기화 되어진다는 것이 문제입니다. 그리고 감지가 가능한 몇 개의 아티팩트들을 남기게 된다. (특별하게, 힙의 끝에서 definite 값과 possible 값이 됩니다.)HEAP_TAIL_CHECKING_ENABLED 플래그는 항상 할당된 블록의 끝에서 연속된 값 “0xA... » 내용보기

Heap flags 실전 2 (Heap Flags 트릭을 이용한 HideOD 우회)

프로그램 소스와 실험적 이해는 "Heap Flags 실전"(sharku.egloos.com/340031)을 참고하기 바랍니다.이론은 "(II-b)Heap Flag"(sharku.egloos.com/302589)을 참고 하기 바랍니다.앞선 "Heap Flags 실전"글에 작성한 프로그램으로 디버깅을 할 경우,올리디버거의 플러그인 중 하나인 HideOD의 ... » 내용보기

Heap flags 실전편

힙플래그에 대해서 우선 기본 지식을 정리해 보면힙의 위치0x0c 의 기본값은 2가 되어야 하며,0x10 의 기본값은 0이 되어야 합니다.이번 글에는 첫번째 플래그(0x0c)의 값을 통해서 실습해보도록 하겠습니다.확인해 보기 위해서 다음과 같은 소스를 구성합니다.파일을 생성하고 파일을 실행시키면 이론적으로 디버깅중일때는 수치가 "0x 50 00 00 62... » 내용보기

Windbg 즐겨쓰는 명령어 모음

본 글은 지극히 개인지향적입니다^-^!pebpeb구조체의 주소를 확인합니다.!peb 0x7ffdf000 (= !peb)해당 주소가 맞을 경우 peb에 관한 정보를 자세하게 표현합니다.!address 7ffdf000peb 구조체의 주소가 "7ffdf000" 일경우 peb에 관한 정보를 간략하게 표시합니다.dt ntdll!_PEB 0x7ffdf000해당 주... » 내용보기