packing/anti-debugging의 개념 및 reversing의 개념 이해codeengn.com/archive/reverse...

16
Packing/Anti-debugging의 개념 및 Reversing의 개념 이해 작성자 : 김원기 ([email protected]) 이호성 ([email protected]) 임재창 ([email protected]) 임원섭 ([email protected]) 한승범 ([email protected]) 03 Nov. 2009

Upload: truongque

Post on 26-May-2018

224 views

Category:

Documents


0 download

TRANSCRIPT

Packing/Anti-debugging 개념 및 Reversing 개념 해

성 : 김원기 ([email protected])

호성 ([email protected])

재창 ([email protected])

원섭 ([email protected])

한승범 ([email protected])

03 Nov. 2009

◉ 차 ◉

1. Packing/Anti-Debugging 개 ....................................01

2. Packing/Anti-Debugging 스 ..................................03

Anti-Debugging

IsDebuggerPresent

PEB 조체 상태값 확 한다.

당할 경 1, 그 않 경

0 하게 다.

IsDebugged

PEB 조체 BeingDebugged 맴 값

확 한다. 당할 경 1, 그

않 경 0 한다.

NtGlobalFlags

PEB 조체에 0x68에 치해 는

NtGlobalFlag 값 확 한다. 0 정상,

당했 경 0 아닌 값

다.

CheckRemoteDebuggerPresent

Win Xp 상 사 할 수

ZwQueryInformationProcess() 사 하여

정보 얻게 다. 0 정상,

당했 경 다 값 한다.

FindWindow

FindWindow() 함수 사 하여 트정

나 클래스 찾아 특정 프

그램 실행 확 한다.

Heap

flags PEB 조체 0x18에 치해 는

Heap flags 검사한다. 정상 경 2

값 하 당할 경 그

값 한다.

Debugger

Interrupts 럽트 수행 에 같 럽

트 드 만났 처 하 않는

경 단한다.

1. Packing/Anti-Debugging 개

Packing 프 그램 압축/암호화하고 그 내 수 는 해 프 그램에 여 실행시

그것 하여 복원한 내 에 고 원래 프 그램 EP 실행하는 식 행

하게 다. Packing 2가 점 다. 첫 째 프 그램 량 적 어들고,

째 툴에 한 어 워 게 었다.

Anti-Debugging 란 프 그램 하 하게 하 해 하는 업 말한다.

Binary 보호하는 하나 쉐어웨어, 과 프 그램, 타 한 프 그램

들 내 알고 과 들 하 하 에 Packing 하거나

Anti-Debugging 적 함 하고 하 하 하는 큰 적

다. Anti-Debugging 적 한 프 그램 실행 에 당한다 하

하 해당 거 프 그램 종료시키거나 에러 생 시키는 등 다양한 사

하여 해한다.

* Anti-Debugging

.386

.model flat, stdcall

option casemap :none ; case sensitive

include c:\masm32\include\windows.inc

include c:\masm32\include\user32.inc

include c:\masm32\include\kernel32.inc

includelib c:\masm32\lib\user32.lib

includelib c:\masm32\lib\kernel32.lib

.data

DbgNotFoundTitle db "Debugger status:",0h

DbgFoundTitle db "Debugger status:",0h

DbgNotFoundText db "Debugger not found!",0h

DbgFoundText db "Debugger found!",0h

.code

start:

2. Packing/Anti-Debugging 스

PEB.NtGlobalFlag

PEB BeingDebugged 플래그 에 , PEB는 NtGlobalFlag라는 필드 갖고 는

NtGlobalFlag는 PEB 0x68 치에 존 한다. LiveKD 하여 PEB 조체 값 확

해보았다.

플러그 값 아니라 0x0 값 담 만 라 0x70 값 담겨

다. 그 같 것 하여 탐 한다.

다 NtGlobalFlag Code 다.

ASSUME FS:NOTHING

MOV EAX,DWORD PTR FS:[30h]

ADD EAX,68h

MOV EAX,DWORD PTR DS:[EAX]

CMP EAX,70h

JE @DebuggerDetected

PUSH 40h

PUSH offset DbgNotFoundTitle

PUSH offset DbgNotFoundText

PUSH 0

CALL MessageBox

JMP @exit

@DebuggerDetected:

PUSH 30h

PUSH offset DbgFoundTitle

PUSH offset DbgFoundText

PUSH 0

CALL MessageBox

@exit:

PUSH 0

CALL ExitProcess

end start

여 ASSUME FS:NOTHING 란 문 그 트 스트 주 값 할당 하는 것

아니라 티브 만나 실행 시에 어 블러가 주 계산하는 경한다. FS

그 트에 NOTHING 라는 는 미 다. FS:[0] Exception handler Default 가

고 다. MASM 컴 러는 본적 스 사 할 ERORR 문에

같 ASSUM FS:NOTHING 주 그 같 ERORR Check Remove 해 다고

어 다.

다 FS:[30] 는 PEB 치에 ADD EAX,68h 에는 NtGlobalFlag 가 존 한다. 해당 드

열어 보았다.

Olly 확 한 NtGlobalFlag 루틴

NtGlobalFlag 회

해당 탐 회는 간단하다. 접 드 치 하여 꾸거나 혹 플래그 값 수정하거나

다. 하 만 것 역시 에 플러그 형태 원 하고 다. 해당 플러그 실행하고

NtGlobalFlag 체크 한 확 해주 동적 시 플래그 값 수정하여 거 탐

회 하게 다. 그 드 치 등 다양한 존 한다. 툴 좀 하게 하는 것

좋다.

다 Olly Advanced NtGlobalFlag 다.

Heap.HeapFlag , Heap.ForceFlags

ProcessHeap PEB 에 0x18 만큼 어져 고 플래그는 프 가 heap

만들어 고 정 는 플래그들 HeapFlag ForceFlas 다. 처 프 그램 힙

역 만들 ForceFlags 에는 0x0 값 HeapFlag 에는 0x2 값 정 다. 하 만

라 NtGlobalFlag 에 라 개 플래그 값 경 다.

만약 탐 어 경 었다 FoceFlags에는 0x40000060값 할당 HeapFlag

에는 0x50000062 값 할당 다. 경 값 체크함 무 한다.

.386

.model flat, stdcall

option casemap :none ; case sensitive

include c:\masm32\include\windows.inc

include c:\masm32\include\user32.inc

include c:\masm32\include\kernel32.inc

includelib c:\masm32\lib\user32.lib

includelib c:\masm32\lib\kernel32.lib

.data

다 PEB ProcessHeap 조체 offset 다.

여 ProcessHeap 조체 살 보 언 한 개 값들 존 한다.

다 Process_Heap Code 다.

DbgNotFoundTitle db "Debugger status:",0h

DbgFoundTitle db "Debugger status:",0h

DbgNotFoundText db "Debugger not found!",0h

DbgFoundText db "Debugger found!",0h

.code

start:

ASSUME FS:NOTHING

MOV EAX,DWORD PTR FS:[18h] ;TEB

MOV EAX,DWORD PTR [EAX+30h] ;PEB

MOV EAX,DWORD PTR[EAX+18h] ;Process_Heap

CMP DWORD PTR DS:[EAX+10h],0 ;Force_Flags

JNE @DebuggerDetected

MOV EAX,DWORD PTR FS:[18h] ;TEB

MOV EAX,DWORD PTR [EAX+30h] ;PEB

MOV EAX,DWORD PTR[EAX+18h] ;Process_Heap

CMP DWORD PTR DS:[EAX+0ch],2 ;Force_Flags

JNE @DebuggerDetected

PUSH 40h

PUSH offset DbgNotFoundTitle

PUSH offset DbgNotFoundText

PUSH 0

CALL MessageBox

JMP @exit

@DebuggerDetected:

PUSH 30h

PUSH offset DbgFoundTitle

PUSH offset DbgFoundText

PUSH 0

CALL MessageBox

@exit:

PUSH 0

CALL ExitProcess

end start

Heap.HeapFlag , Heap.ForceFlags 회

역시 앞 과 동 하게 드 치 플래그 조 회 할 수 다. 또는 플러그

OllyAdvanced 하 쉽게 플래그 값 동 수정 해 다.

.386

.model flat, stdcall

option casemap :none ; case sensitive

include c:\masm32\include\windows.inc

include c:\masm32\include\user32.inc

include c:\masm32\include\kernel32.inc

includelib c:\masm32\lib\user32.lib

includelib c:\masm32\lib\kernel32.lib

.data

DbgNotFoundTitle db "Debugger status:",0h

다 Olly Advanced HeapFlag,ForceFlags 회 다.

NtQueryInformationProcess

CheckRemoteDebuggerPresent API는 거가 프 attach 하는 것 감 한다. API

는 내 적 NtQueryInformationProcess 호출한다. 함수는 또한 내 적 커 조체

EPROCESS DebugPort 플래그 검사한다. 가 저 드 거가 프 attach 한

상태 DebugPort 플래그 값 0 아닌값 정 다.

앞 PEB에 해 간략하게 알아 보았다. PEB 저 드 프 스에 한 추가 정보

여 하는 EPROCESS는 커 에 프 스 하 해 사 하는 조체 정 가 겠

다. 또한 NtQueryInformationProcess 내 적 러낼 는 값 ProcessInformation

값 7 다.

또한 DebugPort 프 0x120 치에 존 하 저 드 에 라

NtQueryInformationProcess 함수 값 hProcess는 0xfffffff 값 그 않 경

에는 0 라는 값 담 게 다.

다 NtQueryInformationProcess Code 다.

DbgFoundTitle db "Debugger status:",0h

DbgNotFoundText db "Debugger not found!",0h

DbgFoundText db "Debugger found!",0h

ntdll db "ntdll.dll",0h

zwqip db "NtQueryInformationProcess",0h

.data?

NtAddr dd ?

MinusOne dd ?

.code

start:

MOV [MinusOne],0FFFFFFFFh

PUSH offset ntdll ;ntdll.dll

CALL LoadLibrary

PUSH offset zwqip ;NtQueryInformationProcess

PUSH EAX

CALL GetProcAddress

MOV [NtAddr],EAX

MOV EAX,offset MinusOne

PUSH EAX

MOV EBX,ESP

PUSH 0

PUSH 4

PUSH EBX

PUSH 7

PUSH DWORD PTR[EAX]

CALL [NtAddr]

POP EAX

TEST EAX,EAX

JNE @DebuggerDetected

PUSH 40h

PUSH offset DbgNotFoundTitle

PUSH offset DbgNotFoundText

PUSH 0

CALL MessageBox

JMP @exit

@DebuggerDetected:

PUSH 30h

PUSH offset DbgFoundTitle

PUSH offset DbgFoundText

PUSH 0

CALL MessageBox

@exit:

PUSH 0

CALL ExitProcess

end start

드에 ? 는 수 언할 값 할당하 않 상태 것 라 생각 다. 어 든

드에 커 API 수행하 해 LoadLibrary GetProcAddress 하여 해당 함수 주

얻 , 앞 한 값 호출 하고 라 는 값 체크하여

거 존 무 하고 습니다.

다 그 드 Olly에 확 한 (NtQueryInformationProcess in Olly) 다.

그 에 알 수 듯 값 저런 식 들어가 호출하게 어야 체크 할 수

다.

.386

.model flat, stdcall

option casemap :none ; case sensitive

include c:\masm32\include\windows.inc

include c:\masm32\include\user32.inc

include c:\masm32\include\kernel32.inc

includelib c:\masm32\lib\user32.lib

includelib c:\masm32\lib\kernel32.lib

.data

msgTitle db "Execution status:",0h

NtQueryInformationProces 회

회하는 역시 여러 가 가 존 할 수 다. 다만 플러그 Olly

Advanced 는 NtQueryInformationProcess 값 하나 hProcess 0 만듦 해

당 루틴 회하게 것 라 생각했 나 않는다. 단 그냥 주 루틴 나

는 에 EAX값 0 정하 회가 다.

Debugger Interrupts

거가 하나 프트 브 크 포 트 수행하 고 할 INT3(0xcc) 삽 함

수행 다. 럽 가 수행 다는 말 처 가 어난다는 미 다. 하 만

거가 수행 같 OP 드 INT3 만난 다 처 없 수행 하게

다.

Debugger Interrupts는 러한 것 착안하여 안티 수행한다. Interrupt 수행

에 같 럽 드 만났 exception 하 않는 경 라고 하게

다. 좀 연한 해 해 아래 드 참고 한다.

다 Debugger Interrupts 다.

msgText1 db "No debugger detected!",0h

msgText2 db "Debugger detected!",0h

.code

start:

ASSUME FS:NOTHING

PUSH offset @Check

PUSH FS:[0]

MOV FS:[0],ESP

; Exception

INT 3h

PUSH 30h

PUSH offset msgTitle

PUSH offset msgText2

PUSH 0

CALL MessageBox

PUSH 0

CALL ExitProcess

; SEH handleing

@Check:

POP FS:[0]

ADD ESP,4

PUSH 40h

PUSH offset msgTitle

PUSH offset msgText1

PUSH 0

CALL MessageBox

PUSH 0

CALL ExitProcess

end start

에 드에 @Check는 exception 어 날 등 는 SEH 다. INT 3 수행

어나 않는다 Debuger dectect 시 가 출 것 다. 다 (Debugger

Interrupt in Olly)에 살 본 습 다.

저 에 INT3 심히 살 보 저 가 문 라고 해하는 수월 할 수 다.

INT3 exception 킨다 0x0040103e 향하게 것 그 않 경 0x00401024

드 향하게 것 다.

5.2 Debug Interrupts 회

회 간단하다. 에 에 보 INT 3 만났 무시하 않고 SEH

following 하라는 택하여 다.

다 과 같 회 하게 다 Exception Handle 빠 는 루틴(Exception Handle 호출하

는 루틴) 볼 수 다.