고급 안티 디버깅 기법
1. 고급 안티 디버깅 기법의 특징
- 기술적 난이도가 높고, 분석자를 심리적·육체적으로 지치게 만듦
- 가비지 코드, 조건 분기, 루프, 암호화/복호화, 깊은 Call-Tree 등을 활용하여 분석을 방해
- 분석자가 엉뚱한 코드에서 헤매게 만들고, 원하는 코드에 접근하기 어렵게 함
- Dynamic 안티 디버깅 기법을 혼합하여 더욱 효과적으로 방어
2. 특징
- 디버깅이 불가능한 것은 아니지만, 매우 높은 난이도를 요구함
- 숙련된 리버싱 전문가도 분석하는 데 오랜 시간과 많은 노력이 필요
- 완벽한 분석은 극도로 어려운 작업
가비지 코드
의미없는 코드를 대량으로 추가시켜 디버깅을 힘들게 하는 기법
예를들어서 push/pop 이런 몇개 명령어에 동일한 operand를 넣어서 의미없는 연산을 하도록 하는거
Breaking Code Alignment
어셈블리 프로그래밍 시 디스어셈블리 코드가 깨진 것 처럼 보이게 됨.
0041510F | FFE3 | JMP EBX | EBX = 415117 |
00415111 | C9 | LEAVE | |
00415112 | C2 08 00 | RETN 8 | |
00415115 | A3 687201FF | MOV DWORD PTR DS:[FF017268], EAX | |
0041511A | 5D | POP EBP |
- 위에서 41510F 주소의 JMP 명령어가 415117 주소로 점프하도록 설계되었지만, 415117 주소의 디스어셈블리 코드가 제대로 표시되지 않음
- 이유: OllyDbg 디스어셈블러가 Breaking Code Alignment 트릭에 의해 혼란되어 잘못된 디스어셈블리 코드를 생성했기 때문
- Breaking Code Alignment 트릭: 415115 주소에서 A3는 MOV 명령어를 의미하며 4바이트 크기의 상수 값을 취해야 하므로 415115의 명령어 크기는 총 5바이트로 해석되어야 한다 (이렇게 코드 사이에 불필요한 코드를 삽입해 디스어셈블리 코드의 가독성을 떨어뜨리는 것이 breaking code alignment
- 의도된 혼란: 415115 주소의 A368은 디스어셈블러를 속이기 위해 의도적으로 삽입된 코드로, 실제 프로그램에서는 사용되지 않음
- 실제 코드: 실제로 실행되는 명령어는 415117 주소의 7201, F7로해서 들어가면 정상적인 코드가 나오게 된다. 415117로..
Encryption/Decryption
간단한 디코딩 코드의 경우 | 특정 메모리 영역을 단순한 연산(XOR, ADD, SUB 등)으로 복호화하는 방식, 일반적으로 일정한 크기의 데이터 블록을 반복문을 통해 처리하며, 디코딩이 완료되면 실행 가능한 정상 코드가 나온다 |
복잡한 디코딩 코드의 경우 | 복잡한 디코딩 루프는 가비지 코드를 포함하여 분석을 어렵게함. (디코딩 과정 흐름 숨기려고 사용), 트레이싱해서 반복되는 패턴 분석하면 유효한 명령어 추출 가능 |
특수한 경우 - 코드 재조합 | 일부 보호 기법에서는 실행 중인 코드 자체를 실시간으로 변경해 가독성을 떨어뜨림. 실행 과정에서 명령어가 변형되거나 재배치해서 디버거의 분석을 방해해서 특정 조건에서 정상적인 실행이 안되게 만드는 것. BP를 무력화하는 효과도 가질 수 있음 |
Stolen Bytes(Remove OEP)
stolen bytes는 실행 파일의 원래 OEP(Original Entry Point)부분에서 몇 바이트를 제거하고 다른 위치로 옮겨 실행하는 깁법
- 일반적으로 PE 파일은 OEP에서 실행이 시작
- 패커나 프로텍터는 OEP의 일부 코드를 다른 곳에 저장한 후, 원래 코드 대신 난독화된 또는 변형된 코드가 있는 새 진입점에서 실행되도록 함
- 실행 중에 원래의 몇 바이트를 복구해 정상적으로 실행되도록 함
- remove OEP는 stolen bytes랑 연계되어 작동 多
- 원래 실행 파일의 OEP 지우거나 덮어씌워서 정적 분석 어렵도록 함
- 실행 시 패커나 로더가 원래 OEP를 복원해 프로그램이 정상적으로 실행되도록 함
- 디버깅 시 분석자가 OEP를 쉽게 찾을 수 없게 만드는 역할을 함
어떻게 활용되는가?
패커 | 실행 파일을 압축 또는암호화하는 패커들은 원본 실행 코드의 일부를 숨기고 압축된 형태로 저장함 실행 시 패커는 원래 코드를 동적으로 복구해 실행 |
안티 디버깅 | OEP가 제거되면 분석자는 실행 파일의 진입점을 쉽게 찾을 수 없고, 프로그램이 어떻게 로드되는지 파악하기 어려워짐 일부 패커는 디버거 감지를 추가해 디버깅 도중 올바른 OEP를복원하지 않도록 함 |
정적 분석 방해 | 실행 파일의 코드가 변조되거나 난독호되면 ida같은 정적분석 도구로 직접 분석하는게 어려워짐 |
복구하려면
메모리 덤프 & OEP 찾기 | 실행 중에 메모리를 덤프하여 원래 코드가 어디 복원되는지 확인 정상 OEP를 찾은 후 이를 이용해 언패킹 시도 |
동적 분석 | 올리디버거, x64dbg, windbg 등 사용해서 프로그램이 OEP를 복원하는 시점 찾기 패커가 복구한 후의 코드를 확인해 원래 실행 코드를 덤프 |
Import Table 복구 | stolen bytes로 인해 import table이 변조된 수도 있으므로 이를 다시 복구해야 정상적인 실행이 가능함 |
API 리다이렉션
디버깅 시에 코드흐름 대략적을 빨리 파악할 수 있는 좋은 방법이 Win32 API에 BP 설치하고 실행하면 실행이 BP에서 멈추고 스택에는 리턴 주소가 저장되는데 이 리턴주소부터 디버깅을 하기 시작하면 핵심코드에 금방 다가갈 수 있음
API 리다이렉션은 이런 디버깅 노하우를 회피하는 방법
API 리다이렉션은 프로그램이 특정 API를 호출할때, 원래의 API 대신 공격자 또는 보호 매커니즘이 설정한 다른 함수로 실행이 변경되는 기술
IAT 후킹, EAT 후킹, API 트램폴린, Detours 후킹, Syscall Hooking 등이 있음
Debug Blocker(Self Debugging)
자기 자신을 디버깅 모드로 실행시키는 기법
프로그램이 실행 중 디버거의 개입을 감지하고 이를 차단하는 기술을 의미
동작 방식
1. 시스템 API를 통한 디버거 탐지
- 운영 체제가 제공하는 API를 호출해 현재 프로세스가 디버깅되는지 확인
2. 하드웨어 인터럽트 및 예외 처리 확용
3. 타이밍 분석을통한 탐지
- 디버거 개입시 실행 속도가 느려지는 것을 가지고 디버거 개입 막음
4. 프로세스 및 메모리 분석
- 현재 실행 중인 프로세스를 조회하여 알려진 디버거가 실행 중인지 확인
- 특정 디버거 관련 DLL 로드 여부 확인
5. 코드 난독화 및 변조 방지
- 프로그램 코드의 실행 흐름을 혼란스럽게 하여 디버깅 어렵게 함
- 메모리 상에서 코드가 변조되었는지 검사
우회방법은 지난 주 했던거.. 아니면은 실행 바이너리 패치해서 기능 제거하기
'공부해요 > 리버싱_핵심원리' 카테고리의 다른 글
52. Dynamic 안티 디버깅 (0) | 2025.01.29 |
---|---|
51. Static 안티 디버깅 (0) | 2025.01.22 |
50. 안티 디버깅 (0) | 2025.01.12 |
49. IA-32 Instruction (0) | 2025.01.12 |
48. SEH (0) | 2025.01.08 |