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)
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;
}
디버거로 분석해보면 아래와 같다.
PEB 주소를 구하기 위해 TEB(ThreadEnvironment Block)에 +0x30 옵셋을 참고한다.
mov EAX, DWORD PTR FS:[30]
-> FS[0x30] = address of PEB
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코드보다 더 먼저 호출되기 때문에 안티 디버깅 기법으로 사용
올리디버거에서 분석을 위해서는 디버깅 옵션에서 Events - Make first pause at - "System breakpoint" 옵션을 사용해야한다. 옵션 사용 시 system 진입점부터 디버깅이 시작되며 TLS 콜백 함수 주소로 이동할 수 있다.
나머지 기법은 다음 포스트에서 다룬다.
'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 |