[Reversing] Windows 10 Anti-Reversing 기법 1

Preview

Windows 환경 리버싱 공부 중 안티 리버싱 기법들이 오래된 OS 버전을 기준으로 하고 있어서 Windows 10 x64에도 가능한 기법을 새로 조사, 실습하여 정리한다.

 

[분석환경]
Windows 10 x64 1903

[개발 & 분석도구]
Visual Studio 2012(v110), OllyDbg, IDA Pro

Anti Reversing

- 디버깅을 방지하고 분석하지 못하도록 막는기술

- 디버깅 발생 시 프로그램 종료 및 에러를 발생시켜 분석을 방해

- 안티 디버깅 기술의 발전 및 이를 우회하는 기술 또한 함께 발전

 

안티 디버깅 종류

Static Dynamic
디버깅 시작 시 동작 디버깅하면서 안티디버깅 기법을 만날때마다 해결
디버거 탐지하여 정상적인 실행 불가 디버깅 도중 수시로 해체 필요
디버거 탐지 목적, 디버거 시작 시 최초 1회 해체 SEH, Timing Check, Break Point Check(0xCC)
PEB, TEB, TLS Callback Function Single Step

PEB(Process Environmnet Block)

PEB 구조체

Win10의 안티디버깅을 위해 다음 구조체 멤버를 사용한다.

  • 0x002 BeingDebugged
  • 0x018 ProcessHeap
  • 0x068 NtGlobalFlag

0x002 BeingDebugged

IsDebuggerPresent() 함수에서 참조하여 사용할 수 있다.

#define _WIN32_WINNT 0x0500
#include <stdio.h>
#include <windows.h>
int main(){
	while(1) {
    	Sleep(1000);
        if(IsDebuggerPresent() == 1){
        	printf("디버깅 당함 \n");
        }
        else{
        	printf("정상\n");
        }
    }
    return 0;
}

디버깅 여부에 따라 결과 출력

디버거로 분석해보면 아래와 같다.

IsDebuggerPresent() 호출
PEB 주소 구한 후, 0x002 멤버 접근, 반환

PEB 주소를 구하기 위해 TEB(ThreadEnvironment Block)에 +0x30 옵셋을 참고한다.

mov EAX, DWORD PTR FS:[30]
    -> FS[0x30] = address of PEB

0x002 멤버 접근 / 정상실행 0 / 디버깅 1
해당 멤버 0x00으로 패치 시 정상으로 판단

 

0x018 Process Heap

 

Flags(+0x40)

ForceFlags(+0x44)

Normalling

0x2

0x0

Debugging

0x40000062

0x40000060

 

Flags (+0x40) = 0x40000062

ForceFlags(+0x44) = 0x40000060

 

 

Flags(+0x40)

ForceFlags(+0x44)

Normalling

0x2

0x0

Debugging

0x40000062

0x40000060

0x068 NtGlobalFlag

디버깅 중일때 PEB.NtGlobalFlag(+0x68) 값은 0x70으로 세팅

  • FLG_HEAP_ENABLE_TAIL_CHECK(0x10)
  • FLB_HEAP_ENABLE_FREE_CHECK(0x20)
  • FLG_HEAP_VALIDATE_PARAMETER(0x40)

플래그 값이 0x70인지 여부 판단하여 디버깅 판단

TLS Callback

TLS(Thread Local Storage)

  • 스레드 별로 독립된 데이터 저장 공간
  • 스레드 내에서 전역 데이터나 정적 데이터를 지역 데이터처럼 독립적으로 취급하고 싶을 때 사용
  • 하나의 프로세스의 모든 스레드는 가상 메모리 공간 공유

TLS Callback 함수

  • 스레드가 생성/종료될 때 자동으로 호출되는 함수
  • 메인 스레드가 생성될 때에도 동일하게 호출
  • EP코드보다 더 먼저 호출되기 때문에 안티 디버깅 기법으로 사용

PE Header에 TLS Table 있으면 기법 사용 의심

올리디버거에서 분석을 위해서는 디버깅 옵션에서 Events - Make first pause at - "System breakpoint" 옵션을 사용해야한다. 옵션 사용 시 system 진입점부터 디버깅이 시작되며 TLS 콜백 함수 주소로 이동할 수 있다.

TLS Callback 함수

나머지 기법은 다음 포스트에서 다룬다.

https://gomguk.tistory.com/46

 

반응형

'Reversing' 카테고리의 다른 글

[Frida] Binary Hooking 2  (0) 2022.05.03
[Frida] Binary Hooking 1  (1) 2022.04.28
DLL Injection 실습  (0) 2020.12.14
[Reversing] Windows 10 Anti-Reversing 기법 2  (0) 2020.12.10
[Binary] PETya 랜섬웨어 분석  (0) 2020.11.27