안티 디버깅(Anti-Debugging)
1) 정의
- 디버깅을 방해하여 분석을 어렵게 하는 기술
- 안티 디버깅을 적용한 프로그램이 실행 중에 있을 때 디버깅을 당한다면 디버깅을 하지 못하도록 에러를 발생시키거나 디버거 프로그램을 종료시키는 등 여러가지 방법을 사용하여 분석을 방해
2) 목적
- 디버깅을 방지하기 위해 사용
- 각종 안티 디버깅 기법들의 동작 원리를 파악한 후 회피하기 위해 사용
Static Anti-Debugging
1) 정의
- 프로그램의 첫 실행에서 디버거를 탐지하는 것
- 안티 디버깅을 수행하는 함수가 호출되는 시점에서만 디버거의 존재를 확인하고 그 뒤에는 탐지하지 않음
- Static 기법이 적용된 파일들은 디버거에서 실행조차 되지 않음
2) Static Anti-Debugging의 해제 방법
① 호출되는 API에 후킹을 걸어 원래 API의 루틴이 아닌 다른 루틴을 수행하도록 하는 방법
② 플러그인을 사용하여 자동으로 해제하는 방법
③ 수동으로 해당 안티디버깅을 풀어내는 방법
3) 디버깅 기법
① PEB(Process Environment Block)
- 현재 프로세스의 디버깅 여부를 판단하기 위해 이용
② NtQueryInformationProcess()
- ntdll!NtQueryInformationProcess() API를 이용하여 프로세스의 디버깅 관련 정보를 얻을 수 있음
③ NtQuerySystemInformation()
- 디버깅 환경을 체크하는 기법
- 현재 OS가 Debug Mode로 부팅되었는지 판단
④ NTQueryObject()
- 시스템에서 어떤 디버거가 다른 프로세스를 디버깅 중일 때 DebugObject타입의 커널 객체가 생성되는데, 그 DebugObject의 존재를 확인하는 것
- ntdll!NtQueryObject() API를 이용하여 시스템의 다양한 종류의 커널 객체 정보를 얻을 수 있음
⑤ ZwSetInformationThread()
- ZwSetInformationThread() API를 사용하면 자신을 디버깅하고 있는 디버거를 떼어낼 수 있음
- ZwSetInformationThread() 함수는 스레드에게 정보를 세팅하는 System Native API
⑥ TLS 콜백 함수
- 프로그램의 Entry Point 코드보다 먼저 실행되기 때문에 유용하게 사용
- IsDebuggerPresent() 함수로 디버깅 여부를 판별하여 프로그램을 계속 실행할지 결정
Dynamic Anti-Debugging
1) 정의
- 프로그램이 실행되는 중간중간 계속하여 디버거를 탐지하는 것
- 프로그램의 실행과 함께 계속하여 실행되며 중간중간 디버거의 유무를 확인하기 때문에 지속적으로 해제가 필요
- 디버거 트레이싱을 방해하여 원본 프로그램의 코드와 데이터를 확인할 수 없게 만드는 것
※ 디버거 트레이싱 : 디버깅 당하는 쪽의 내부 구조를 하나씩(한줄씩) 실행하면서 레지스터, 메모리 등을 실시간으로 확인하는 것
2) Dynamic Anti-Debugging의 해제 방법
① 호출되는 API에 후킹을 거는 방법
② 플러그인을 사용하여 자동으로 해제하는 방법
③ 프로그램을 이용하여 자동적으로 풀어내거나 디버거로 설정하는 방법
④ 수동으로 해당 안티디버깅을 풀어내는 방법
3) 디버깅 기법
① 예외(Exception)
- 정상적으로 실행된 프로세스에서 예외가 발생하면 SEH(Structured Exception Handling) 메커니즘에 의해 OS에서 예외를 받아서 프로세스에 등록된 SEH를 호출하지만, 디버깅 당하는 경우에 예외가 발생하면 디버거에서 예외처리를 담당
→ 정상 실행되는 경우와 디버깅 당하는 경우를 판별하여 서로 다른 동작 수행
② Timing Check
- 디버거 트레이싱을 할 때 발생하는 실행 시간의 차이를 측정하여 디버깅 여부를 판별
③ 0xCC Detection
- 일반적으로 프로그램을 디버깅할 때 Software BP(BreakPoing)를 많이 설치하는데, BP의 x86 Instruction은 '0xCC’
→ 이 값이 정확히 발견된다면 디버깅 여부를 판별 가능
안티 디버깅 종류
'2020 WINTER STUDY > CTF Study' 카테고리의 다른 글
[Reversing] Day 7_CodeEngn Basic RCE L04 (0) | 2021.02.24 |
---|---|
[Reversing] Day 6_CodeEngn Basic RCE L02 (0) | 2021.02.22 |
[Reversing] Day 5_CodeEngn Basic RCE L06 (0) | 2021.02.19 |
[Reversing] Day 5_패킹, 언패킹 (0) | 2021.02.19 |
[Reversing] Day 4_abex' crackme #2 (0) | 2021.02.18 |