[2013 codeengn conference 09] park.sam - 게임 해킹툴의 변칙적 공격 기법 분석

17
게임 해킹툴의 변칙적 공격 기법 분석 게임 해킹툴의 변칙적 공격 기법 분석 박근영 2013.11.30 www.CodeEngn.com 2013 CodeEngn Conference 09

Upload: gangseok-lee

Post on 22-Apr-2015

754 views

Category:

Education


0 download

DESCRIPTION

2013 CodeEngn Conference 09 게임 보안 제품의 보안성이 강화됨에 따라 해킹툴의 공격 기법 또한 다양해 지고 있다. 몇 몇 해킹툴은 게임에 접근하기 위해 OS의 디버깅 메커니즘 악용한다거나 시스템 프로세스로 위장하게 되는데 이와 같은 몇가지 변칙적인 기법에 대해 알아보고자 한다. http://codeengn.com/conference/09 http://codeengn.com/conference/archive

TRANSCRIPT

Page 1: [2013 CodeEngn Conference 09] Park.Sam - 게임 해킹툴의 변칙적 공격 기법 분석

게임 해킹툴의변칙적 공격 기법 분석

게임 해킹툴의변칙적 공격 기법 분석

박근영2013.11.30

www.CodeEngn.com2013 CodeEngn Conference 09

Page 2: [2013 CodeEngn Conference 09] Park.Sam - 게임 해킹툴의 변칙적 공격 기법 분석

ContentsContents

[ 공격기법 1 ] 게임코드조작 By OpenProcess

[ 방어기법 1 ] OpenProcess 접근방어

[ 공격기법 2 ] 게임코드조작 By BrainSwitching

[ 공격기법 3 ] 게임코드조작 By DLL-Injection

[ 방어기법 2 ] 메모리 CRC 비교

[ 공격기법 4 ] 게임코드조작 By DR 조작

01

02

03

04

05

06

01

02

03

04

05

06

Page 3: [2013 CodeEngn Conference 09] Park.Sam - 게임 해킹툴의 변칙적 공격 기법 분석

© AhnLab, Inc. All rights reserved.

기사 자료

Page 4: [2013 CodeEngn Conference 09] Park.Sam - 게임 해킹툴의 변칙적 공격 기법 분석

© AhnLab, Inc. All rights reserved.

실험 대상

TargetFPS.exe

Page 5: [2013 CodeEngn Conference 09] Park.Sam - 게임 해킹툴의 변칙적 공격 기법 분석

© AhnLab, Inc. All rights reserved.

TargetFPS.exe

코드 조작 by OpenProcess

CodeModify.exe

szPatchedByte[0] = 0x90;szPatchedByte[1] = 0x90;szPatchedByte[2] = 0x90;

WriteProcessMemory(hProcess, 0x4071e7, szPatchedByte, 3, ..)

hProcess =OpenProcess(…,TargetFPS_PID)

VirtualProtectEx(hProcess, 0x4071e7, 0x3, PAGE_EXECUTE_READWRITE , ..)

게임 코드 조작 By OpenProcess[공격 기법 1]

Page 6: [2013 CodeEngn Conference 09] Park.Sam - 게임 해킹툴의 변칙적 공격 기법 분석

© AhnLab, Inc. All rights reserved.

Protector_dll.dll

OpenProcess접근 방어

[방어 기법 1] OpenProcess 접근 방어

CodeModify.exe

코드 조작 by OpenProcess

TargetFPS.exe

IF (OpenProcess 대상 PID==TargetFPS PID) IF (접근 시도 Process != OS Process)

return FAIL

szPatchedByte[0] = 0x90;szPatchedByte[1] = 0x90;szPatchedByte[2] = 0x90;

WriteProcessMemory(hProcess, 0x4071e7, szPatchedByte, 3, ..)

hProcess =OpenProcess(…,TargetFPS_PID)

VirtualProtectEx(hProcess, 0x4071e7, 0x3, PAGE_EXECUTE_READWRITE , ..)

Page 7: [2013 CodeEngn Conference 09] Park.Sam - 게임 해킹툴의 변칙적 공격 기법 분석

© AhnLab, Inc. All rights reserved.

Protector_dll.dll

OpenProcess접근 방어

[공격 기법 2] 게임 코드 조작 By BrainSwitching

CodeModify.exe

코드 조작 by OpenProcess

BrainSwitching.exe

TargetFPS.exe

IF (OpenProcess 대상 PID==TargetFPS PID) IF (접근 시도 Process != OS Process)

return FAIL

Page 8: [2013 CodeEngn Conference 09] Park.Sam - 게임 해킹툴의 변칙적 공격 기법 분석

© AhnLab, Inc. All rights reserved.

CreateProcess(.. ”TaskMgr.exe”, .. ,CREATE_SUSPENDED, .. , &TaskMgr_PI)

[공격 기법 2] 게임 코드 조작 By BrainSwitching

NtDll ! UnmapViewOfSection(TaskMgr_PI->hProcess, TaskMgr.이미지베이스)pTaskMgr_Image = VirtualAllocEx(TaskMgr_PI->hProcess, CodeModify.이미지베이스, CodeModify.이미지전체사이즈, ..)WriteProcessMemory(TaskMgr_PI->hProcess, pTaskMgr_Image , CodeModify.헤더 데이타, ..)WriteProcessMemory(TaskMgr_PI->hProcess, pTaskMgr_Image + CodeModify.섹션별VA, CodeModify.섹션별 데이타, ..) X 섹션개수GetThreadContext(TaskMgr_PI->hProcess, &Context)Context.Eax = (CodeModify.이미지베이스 + CodeModify.엔트리포인트주소)SetThreadContext(TaskMgr_PI->hProcess, &Context)ResumeThread(TaskMgr_PI->hThread)

CreateProcess(..)

NtDll ! UnmapViewOfSection(..)

VirtualAllocEx(..)

WriteProcessMemory(..)

WriteProcessMemory(..)

GetThreadContext(..)

Ctx.Eax = CodeModify.이미지

SetThreadContext(..)

ResumeThread(..)

BrainSwitching.exeCodeModify.exe

TaskMgr.exe(Process)

.text

.rdata

.data

.rsrc

header

CodeModify.exe(File-base)

CodeModify.exe(File-base)

.text

.rdata

.data

.rsrc

headerheader

.text

.rdata

.data

.rsrc

Page 9: [2013 CodeEngn Conference 09] Park.Sam - 게임 해킹툴의 변칙적 공격 기법 분석

© AhnLab, Inc. All rights reserved.

[공격 기법 3] 게임 코드 조작 By DLL-Injection

Protector_dll.dll

OpenProcess접근 방어

IF (OpenProcess 대상 PID==TargetFPS PID) IF (접근 시도 Process != OS Process)

return FAIL

CodeModify.exeCodeModify.exe

코드 조작 by OpenProcess코드 조작 by OpenProcess

BrainSwitching.exeBrainSwitching.exeBrainSwitching.exe

TargetFPS.exe

CodeModify_dll.dll

코드 조작 by DLL-인젝션

DLL_Injector.exe

VirtualProtect(0x4071e7, 0x3, PAGE_EXECUTE_READWRITE , ..)

szPatchedByte[0] = 0x90;szPatchedByte[1] = 0x90;szPatchedByte[2] = 0x90;

memcpy((LPVOID) 0x4071e7, szPatchedCodes, 3);

Page 10: [2013 CodeEngn Conference 09] Park.Sam - 게임 해킹툴의 변칙적 공격 기법 분석

© AhnLab, Inc. All rights reserved.

[방어 기법 2] 메모리 CRC 비교

CodeModify.exeCodeModify.exe

코드 조작 by OpenProcess코드 조작 by OpenProcess

BrainSwitching.exeBrainSwitching.exeBrainSwitching.exe

CodeModify_dll.dll

코드 조작 by DLL-인젝션

DLL_Injector.exe

Protector_dll.dll

OpenProcess접근 방어

Memory CRC 비교

if (원본Mem_Crc32 != 현재Mem_Crc32)코드조작 감지!

TargetFPS.exe

Page 11: [2013 CodeEngn Conference 09] Park.Sam - 게임 해킹툴의 변칙적 공격 기법 분석

© AhnLab, Inc. All rights reserved.

게임 코드 조작 By DR 조작

CodeModify.exeCodeModify.exe

코드 조작 by OpenProcess코드 조작 by OpenProcess

BrainSwitching.exeBrainSwitching.exeBrainSwitching.exe

CodeModify_dll.dll

코드 조작 by DLL-인젝션

DLL_Injector.exe

Protector_dll.dll

OpenProcess접근 방어

Memory CRC 비교

DR_Modify_dll.dll

코드 조작 by DR 조작

TargetFPS.exe

[공격 기법 4]

Page 12: [2013 CodeEngn Conference 09] Park.Sam - 게임 해킹툴의 변칙적 공격 기법 분석

© AhnLab, Inc. All rights reserved.

TargetFPS.exe

[공격 기법 4] 게임 코드 조작 By DR 조작

Kernel32 ! AddVectoredExceptionHandler(0, DebugHookHandler)hThread = OpenThread( THREAD_SUSPEND_RESUME | THREAD_GET_CONTEXT | THREAD_SET_CONTEXT |THREAD_QUERY_INFORMATION, FALSE, TargetThreadID )SuspendThread( hThread )ctx.ContextFlags = CONTEXT_DEBUG_REGISTERS;ctx.Dr0 = (DWORD) 0x004071e7ctx.Dr7 |= 0x00000001SetThreadContext( hThread, &ctx )ResumeThread( hThread )

LONG __stdcall DebugHookHandler(PEXCEPTION_POINTERS ExceptionInfo) { …

if(ExceptionInfo->예외발생주소 == 0x4071e7){

ExceptionInfo->ContextRecord->Eip = 0x004071e7 + 0x3; Return..;} …

}

AddVectoredExceptionHandler(..)

hThread = OpenThread(..)

SuspendThread( hThread )

ctx.ContextFlags= CONTEXT_DEBUG_REGISTERS;ctx.Dr0 = 0x4071e7;ctx.Dr7 |= 0x00000001;

SetThreadContext( hThread,&ctx );

ResumeThread( hThread );

DR_Modify_dll.dll

코드 조작 by DR 조작

Page 13: [2013 CodeEngn Conference 09] Park.Sam - 게임 해킹툴의 변칙적 공격 기법 분석

© AhnLab, Inc. All rights reserved.

[공격 기법 4] 게임 코드 조작 By DR 조작

Kernel32 ! AddVectoredExceptionHandler(0, DebugHookHandler)

hThread = OpenThread( THREAD_SUSPEND_RESUME | THREAD_GET_CONTEXT | THREAD_SET_CONTEXT |THREAD_QUERY_INFORMATION, FALSE, TargetThreadID )

SuspendThread( hThread )

ctx.ContextFlags = CONTEXT_DEBUG_REGISTERS;ctx.Dr0 = (DWORD) 0x004071e7ctx.Dr7 |= 0x00000001

SetThreadContext( hThread, &ctx )ResumeThread( hThread )

LONG __stdcall DebugHookHandler(PEXCEPTION_POINTERS ExceptionInfo) { …

if(ExceptionInfo->예외발생주소 == 0x4071e7){

ExceptionInfo->ContextRecord->Eip = 0x004071e7 + 0x3; Return..;} …

}

Page 14: [2013 CodeEngn Conference 09] Park.Sam - 게임 해킹툴의 변칙적 공격 기법 분석

© AhnLab, Inc. All rights reserved.

인터럽트 1

[예외 핸들러]

인터럽트 발생 당시

의 CPU 레지스터 정

보를 갖고 있음

DR0 = BP 주소

게임 코드 조작 By DR 조작[공격 기법 4]

Debug Register

Page 15: [2013 CodeEngn Conference 09] Park.Sam - 게임 해킹툴의 변칙적 공격 기법 분석

© AhnLab, Inc. All rights reserved.

• Debug Register: 디버깅 목적으로 프로세서에서 사용하는 레지스터

• DR0 ~ DR3

• BreakPoint를 설정할 주소를 저장

• DR6

• 디버그 상태 레지스터

• DR7

• 디버그 제어 레지스터 : breakpoint 상태를 선택적으로 활성화/비활성화

• Debug Register: 디버깅 목적으로 프로세서에서 사용하는 레지스터

• DR0 ~ DR3

• BreakPoint를 설정할 주소를 저장

• DR6

• 디버그 상태 레지스터

• DR7

• 디버그 제어 레지스터 : breakpoint 상태를 선택적으로 활성화/비활성화

게임 코드 조작 By DR 조작[공격 기법 4]

Debug Register

Page 16: [2013 CodeEngn Conference 09] Park.Sam - 게임 해킹툴의 변칙적 공격 기법 분석

© AhnLab, Inc. All rights reserved.

조작 기법별 테크맵

CodeModify.exeCodeModify.exe

코드 조작 by OpenProcess코드 조작 by OpenProcess

BrainSwitching.exeBrainSwitching.exeBrainSwitching.exe

CodeModify_dll.dll

코드 조작 by DLL-인젝션

DLL_Injector.exe

Protector_dll.dll

OpenProcess접근 방어

Memory CRC 비교

DR_Modify_dll.dll

코드 조작 by DR 조작

TargetFPS.exe

Page 17: [2013 CodeEngn Conference 09] Park.Sam - 게임 해킹툴의 변칙적 공격 기법 분석

© AhnLab, Inc. All rights reserved.

Thank you

Q&Awww.CodeEngn.com2013 CodeEngn Conference 09