본문 바로가기

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 구조체..
Mutex 뮤텍스 API 함수 정리 Mutex 뮤텍스 API 함수 정리뮤텍스는 커널 모드 동기화 오브젝트 이다. 동기화를 위해 사용되는 API 함수들은 아래와 같다.1) CreateMutex : 뮤텍스 생성 (핸들 획득)2) OpenMutex : 뮤텍스 핸들 획득 (핸들 획득)3) ReleaseMutex : 뮤텍스 반환 [사용]WaitForSingleObject(hMutex, INFINITE); //뮤텍스 획득까지 기다림. ( 기다릴 뮤텍스의 핸들, 기다리는 시간 )//사용//ReleaseMutex(hMutex); API 함수들을 하나씩 살펴 보자.1) CreateMutexSyntax출처 : https://docs.microsoft.com/ko-kr/windows/desktop/api/synchapi/nf-synchapi-createmut..
(임계영역) CriticalSection API 함수 정리 (임계영역) CriticalSection API 함수 정리 뮤텍스와 비슷한 개념이지만, 임계영역은 '같은' 프로세스 내부의 스레드를 동기화 한다. (속도 더 빠름) 당연히 공유자원 사용에서 발생하는 문제를 유발하지 않으려면 한번에 하나의 스레드만 진입 해야한다.관련 API 함수를 알아보자. 출처 : https://docs.microsoft.com/en-us/windows/desktop/api/synchapi/nf-synchapi-tryentercriticalsection [ 임계 영역 사용 흐름 ] 1) 임계영역 초기화InitializeCriticalSectionInitializeCriticalSectionAndSpinCount 2) 임계영역 소유권 획득/반환 --- 상호 배타적 접근을 만족하며 프로세스..
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
Windbg LFH 동작시킨 상태로 디버깅하는 방법 Win7부터는 Low Fragment Heap이 default Frontend heap으로 설정되어 LFH 힙을 고려해야할 때가 자주 있습니다. 디버거에 기본적으로 Heap 관련 GFlags 들이 동작하기 때문에, 디버거 상에서 Open Executable로 파일을 열면 LFH가 동작하지 않습니다.이러한 GFlags들이 꺼진 상태여야 LFH가 enable 됩니다. !heap: 해당 명령어로 맨 첫번째에 있는 base heap 주소를 얻고, dt _heap [힙베이스주소]ex) dt _heap 550000: 힙 정보 값 조회. [LFH 미동작] [LFH 동작] 가장 쉬운 방법은 프로그램을 실행시킨 후 Attach 하는 방식으로 디버깅을 진행하면 LFH가 enable 된 상태에서 디버깅이 가능합니다. 두번째..
힙 디버깅 !heap사용되고 있는 힙들 목록 출력. !heap -m [힙]특정 힙에대한 모든 세그먼트들 출력. !heap -h [힙]LFH 제외한 모든 힙 엔트리 출력. (-hl 옵션은 LFH까지 포함)
windbg symbol path 설정 Windbg에서 심볼패스 설정하기. 참고주소 : https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/symbol-path windbg를 이용하여 디버깅 시에, 심볼패스를 설정해 주면 디버깅 시에 도움이 되는 관련 DLL 심볼 정보들을 이용하여 더욱 편하게 디버깅을 진행할 수 있다. windbg에서 symbol path를 설정하는 방법을 간단히 살펴보자. windbg는 ms에서 제공하는 윈도우 맞춤 디버거로, 당연히 ms 홈페이지에서 자세한 설명을 제공하고 있다. symbol path를 설정하는 다양한 방법은 위 '참고주소'에서 다양하게 다루고 있다. ms에서도 cache를 사용하여 locally하게 심볼을 사용할 것을 추천하고 있고, 인..