study/논문

[논문] 윈도우 환경에서의 메모리 해킹 방지 시스템 연구

lucykorea414 2023. 11. 20. 21:26
728x90

기본 정보

논문 저자: 김요식 , 윤영태, 박상서
게재처: 정보보증논문지
연도: 2005
요약: 역공학(Reverse Engineering) 기술이 진보함에 따라 컴퓨터 소프트웨어에 대한 불법 조작 및 변조 등의 위협이 증가하고 있으며, 인터넷에 공개된 단순한 도구를 이용하여 누구나 쉽게 크래킹(Cracking)을 할 수 있게 되었다. 자사의 소프트웨어를 위협으로부터 방어하고자 하는 제작사들의 노력과 이를 무력화시키고자 하는 소위 크래커들의 노력은 지금까지도 계속되고 있다. 이에 본 논문에서는 소프트웨어가 가지는 위협 모델과 크래킹 기술에 대해 분석 및 실험하고, 소프트웨어를 위협으로부터 보호하기 위한 윈도우 환경에서의 메모리 해킹 방지 시스템을 제안한다.
주제: Malware, reverse engineering, software security


1. 서론 및 배경지식

저작권을 보호 하기 위한 기술

  1. 사용자에게 등록번호를 입력하도록 하고 올바른 등록번호 여부를 검사하는 방법

    = 시리얼 넘버, 라이센스 넘버

  2. 소프트웨어에 보이지 않는 워터마크 주입하기

    → “소프트웨어에 비밀리에 정보를 삽입하는 절차”

    (Java 프로그램에 적용가능한 소프트웨어 워터마킹 참고)

    • 정보: 소프트웨어의 소유권을 구별할 수 있는 정보

      → 저작권자가 소프트웨어에서 비밀정보를 추출함으로써 허가되지 않은 소프트웨어 복제를 증명하는 수단으로 활용

      1) 저작권 보호

      2) 소프트웨어 실행 무결성 보장

      3) 실행 파일에 대한 접근 제어

  3. 하드웨어를 접목시켜 소프트웨어를 보호하는 기술

    → 동글

본 논문의 내용

2장

  • 소프트웨어가 가지는 위협 모델 분석하여 문제점 도출
  • 소프트웨어에 대한 크래킹 방법에 대한 예

3장

  • 소프트웨어를 위협으로부터 보호할 수 있는 대응책
    • 윈도우 환경에서의 메모리 해킹 방지 시스템 제안

4장

  • 결론 및 향후 방향 제시

2. 소프트웨어 크래킹 기술

2.1 위협 모델

크래킹으로 인해 발생하는 문제

소프트웨어 위협 모델

소프트웨어 위협 모델

  • 모니터링: 내부 비밀 데이터가 누출될 수 있음
  • 역공학: 로직을 추출하여 분석할 수 있음
  • 소프트웨어 해적판(Software Piracy): 로직을 임의 조작하여 복사본을 만들거나 패키지 전체를 무작위로 재배포 할 수 있음
  • 탬퍼링: 로직을 임의 조작하여 프로그램의 흐름을 초기 제작 의도와는 다르게 위/변조가 가능
    (임베디드 안티 템퍼링 기술 참고: https://coontec.kr/anti-tampering/)

2.2 크래킹 기술

단순 등록번호: 등록키(Registration Key), 다중 일련번호(Multiple Serials)

  1. 등록번호를 비교하는 코드상의 분기문을 수정

    → 아예 비교하는 분기문을 실행하지 않고 바로 프로그램이 실행되게 점프!

  2. 디버깅을 통해 하드코딩된 등록번호 알아내기

    → 메모리에 들어있는 등록번호 리버싱으로 확인 가능

  3. 등록번호를 생성하는 알고리즘을 분석하여 등록번호만을 전문적으로 생성하는 프로그램을 제작할 수 있음

    → NuGet 시리얼키 생성기 만들어본거 생각해보기!!

    → 아예 시리얼키 비교 과정을 분석해서 통과할 수 있게 시리얼키 생성기 만들수도 있고, 아니면 시리얼키를 내부에서 입력값으로 생성후 비교하는 과정이면 코드를 반대로 짜서 크래킹 가능 (https://lucykorea414.tistory.com/7 참고!)

패커에 의해 압축/암호화되어 있는 코드

메모리상에서 언패킹 되어 실행된다는 취약점 이용 → 패커 기능 무력화 가능

동글(Dongle): 하드웨어를 접목하여 부속시키는 방법

  • 위조된 드라이버를 제작
  • 별도의 에뮬레이터를 이용하여 동글 없이도 소프트웨어를 동작할 수 있음

2.3 크래킹 방법

2.3.1 내그 스크린 무력화

일반적으로 다이얼로그를 출력하기 위해 Win32API 를 사용

  • GetSystemTime
  • GetLocalTime
  • GetTickCount

→ bp 설정하여 분석

[Helios 사의 TextPad ver4.7]

Untitled

  • (bp)004055C7 - GetTickCount API: 내그 스크린이 시작되어 경과된 시간을 밀리초 단위로 리턴
    • 내그 스크린을 화면상에 출력하는 부분은 앞부분으로 유추 가능!
    • 내그 스크린의 윈도우 호출 여부를 결정하는 조건도 앞부분으로 유추 가능!
  • 004055A5 - 호출문: 내그 스크란을 호출하는 구문
    • 등록 버전의 경우 내그 스크린을 호출하지 않는 위치인 004055D3으로 점프
    • 비등록 버전의 경우 내그 스크린 호출(점프 하지 않고 밑줄로 그대로 실행)
  • 004055AD - 점프문: 내그 스크린의 호출 여부 결정짓는 조건 분기문
    • 여기서 JE(74 24)JMP(EB 24)로 1 바이트만 수정하여 패치하면 비등록 버전의 경우에도 내그 스크린 호출되지 않음

2.3.2 프로세스 패치

인터넷을 통해 배포되는 프로그램들의 보안기능

  • 패커 사용: 프로텍션 기능의 일환
  • 디버거 자동 감지 기능 포함: 프로그램 바이너리에 대한 역공학(리버싱) 방지

[Helios 사의 TextPad ver4.7]

Untitled

→ TextPad를 UPX 패킹하였음

Untitled

→ 언팩 과정: 패커를 통해 압축/암호화된 코드는 메모리 상에서 프로그램을 수행하기 위해 언팩 과정을 수행함

→ 언팩 과정을 거치면서 패킹된 프로그램 엔트리 포인트(PEP, Program Entry Point)에서 언팩된 엔트리 포인트로 분기

Untitled

→ 패커의 마지막 부분에 원래의 TextPad.exe가 가지는 프로그램 엔트리 포인트인 004BD302로 점프하는 구문이 포함

→ UPX를 통해 압축/암호화를 수행해도, 프로그램 원래의 엔트리 포인트와 1 바이트 패치를 통해 내그 스크린을 무력화시킨 코드의 메모리상의 위치에는 변화가 없음을 의미

Untitled

→ Dummy code: TextPad.exe내의 섹션과 섹션 사이의 슬랙 공간(Slack Space)이나 “0”으로 채워진 일정 공간에 채워지는 코드

push eax
mov eax,404ED0h
mov byte ptr [eax],0EBh
pop eax
jmp 004A038E

이러한 과정을 통하여 TextPad의 내그 스크린을 화면상에 보이지 않도록 하는 동일한 결과를 얻을 수 있음.

→ 이 과정이 가능한 이유

  • UPX가 가지는 섹션 자체가 실행 가능한 영역임
  • 패킹이 되어있어도 언팩 과정을 통해 압축해제 및 복호화가 됨

2.3.3 로더를 이용한 패치

[로더를 이용한 기본적인 패치 절차]

Untitled

→ 패치 벡터 초기화: 대상 프로그램이 정해지면 디버거 등을 통해 대상 프로그램을 분석하여 패치하고자 하는 주소 위치와 변경할 데이터 등을 초기화하는 과정

→ CreateProcess API: 초기화 과정 종료 후 대상 프로그램을 직접 호출

→ WriteMemory API: 파라미터에 패치 벡터를 적용하여 메모리 조작

[로더 제작에 자주 사용되는 API]

로더는 이미 실행중인 프로세스에 대해서도 메모리 조작이 가능함

이때도 Win32 API를 사용함

Win32 API 기능
GetWindowThreadProcessId 대상 프로세스에 대한 ID 리턴
OpenProcess 대상 프로세스 개방
VirtualProtextEx 패치하고자하는 주소의 권한을 변경
WriteProcessMemory 패치하고자하는 주소에 패치 벡터를 적용

2.4 크래킹 도구

소프트웨어가 가지고 있는 방어 기능을 무력화 시키기 위해서는 분석 및 크래킹 도구 없이는 불가능

  • 역공학 도구
  • 시스템 모니터링 도구

2.4.1 역공학 도구

역공학 도구

  • 프로그램 내부의 로직을 분석하는 데 사용
  • 취약점과 익스플로잇 제작
  • 종류
    • 정적 로직에 대한 분석: 역어셈블러(Disassembler), 디컴파일러(Decompiler)
    • 동적 분석(실행되는 상태에 대한 분석): 디버거(Debugger)

(1) 역어셈블러/디컴파일러

역어셈블러

  • 컴파일된 코드를 분석하여 어셈블리 코드와 대응되는 코드를 생성
  • 하위 레벨의 소스코드를 생성하는데 사용
  • W32Dasm: 윈도우 환경에서 사용되는 대표적인 역어셈블러

디컴파일러

  • C/C++ 코드의 바이너리 파일에 대한 디컴파일은 완벽하게는 어려움
  • 자바의 바이너리 파일에 대한 디컴파일은 거의 완벽하게 얻을 수 있음

W32Dasm

  • 16/32 비트 윈도우 프로그램에 대한 역어셈블 지원
  • MMX 명령에 대한 역어셈블 지원
  • 익스포트, 임포트, 메뉴, 다이얼로그, 텍스트 참조 정보 디스플레이
  • 32비트 프로그램을 위한 통합 디버거

(2) 디버거

디버거

  • 프로세스를 에뮬레이트하면서 동작
  • 디버거 내에서 프로그램을 실행
  • 런타임 실행, 메모리 및 레지스터의 내용 확인 가능
  • 브레이크 포인트 설정하고 트레이스(Trace) 가능
  • 종류: 응용프로그램 수준 디버거, 시스템 레벨 디버거
    • 응용프로그램 수준 디버거: OS와 디버깅하는 프로그램 사이에서 동작
    • 시스템 레벨 디버거: 프로세서와 OS 사이에서 동작, OS 자체의 디버깅까지 가능

디버거에서 자주 사용되는 기능

  • Step over, Step into: 소스 구문 각각에 대한 실행
  • 브레이크 포인트: 지정한 위치까지의 프로그램 실행
  • 와치(Watch): 디버깅 중 변수 값 출력
  • 프로그램 디버깅 중 변수값 변경
  • 런타임시 메모리와 레지스터 값에 대한 모니터링과 변경
  • 역어셈블
  • 스택(Stack) 모니터링

대표적인 디버거

  • Compuware사의 소프트아이스(SoftIce)
    • 시스템 수준의 디버거
    • 싱글 또는 듀얼 머신상에서 디바이스 드라이버 디버깅이 가능한 커널 모드 디버거
    • 다양한 윈도우 프로그램의 문제에 대해 이해/진단하기가 쉽고 시스템에 대해 전반적인 내용을 볼 수 있음
  • DataRescue사의 IDA Pro
  • 오픈소스인 OllyDBG

2.4.2 시스템 모니터링 도구

모니터링 도구

  • 프로그램이 동작하는 동안 프로그램이 접근하는 파일이나 레지스트리의 상태 및 정보를 제공하여 주는 도구
  • 대표적 도구: Sysinternals사의 Filemon과 Regmon
    • Filemon
      • 실시간으로 시스템상의 사스템 파일 동작에 대해 디스플레이 해 줄 뿐만 아니라 윈도우의 동작을 모니터 할 수 있음
      • 응용 프로그램이 사용하는 파일, DLL, 또는 시스템이나 응용 프로그램의 문제점으로 인한 단서를 찾을 수 있음
      • 모든 파일이 open, read write, delete되는 행위에 대한 결과를 타임 스탬프 형태로 확인할 수 있음
    • Regmon
      • 윈도우 시스템의 레지스트리 모니터링 도구
      • 특정 응용프로그램이 레지스트리에 접근하여 읽고 쓰는 상황을 실시간으로 모니터링

2.4.3 기타 도구

Hex 에디터

  • 바이너리 파일에 대한 최종 패치 작업
  • 바이너리 파일에 대한 편집 및 복사/붙여넣기 지원
  • 바이너리 형태의 실행파일의 코드를 수정하여 패치 된 최종의 바이너리를 저장할 수 있음
  • 대표적 도구: BreakePoint사의 Hex Workshop, IDM사의 Ultra Editor

3. 윈도우 환경에서의 메모리 해킹 방지 시스템

3.1 시스템 개요

악성 프로그램의 Win32API 사용 비교

프로그램 주요 Win32 API
freebox.exe SuspendThread, CreateProcess,
GetModuleFileName, ResumeThread, VirtualProtectEx, WriteProcessMemory, ReadProcessMemory, GetCommandLine
fdx-pop.exe OpenProcess, GetModuleHandle, GetCommandLine, CreateProcess, WriteProcessMemory
freehack.exe VirtualProtectEx, TerminateProcess, ReadProcessMemory, OpenProcess, GetProcAddress, WriteProcessMemory
asx-ds2.exe FindResourceA, GetModuleHandleA, LoadResource, OpenProcess, SizeofResource, WriteProcessMemory

→ 악성 프로그램의 일종인 로더는 Kernel32.dll, User32.dll 등의 시스템 DLL에서 제공하는 Win32 API를 이용하여 보호대상 프로세스에 대한 메모리를 조작함

[freehack.exe를 역어셈블한 코드 일부]

Untitled

→ User32.dll 내의 FindWindow를 이용하여 접근 대상 프로세스의 핸들을 얻어옴

→ GetWindowThreadProcessId에 의해 프로세스 ID 획득

→ OpenProcess, VirtualProtectEx, WriteProcessMemory, CloseHandle API를 호출하여 대상 프로세스가 가지는 특정 위치의 메모리를 조작함

[본 논문에서 제시하는 대응책]

  1. 악성 프로그램의 Win32 API 사용 패턴과 실행 모듈에 대한 해쉬 검증

  2. 시스템 와이드 훅(System Wide Hook)이용

    $\therefore$ 클라이언트 시스템상에서 메모리를 조작하는 악성 소프트웨어 모니터 & 임의 조작 방지 하는 시스템 제안

3.2 시스템 구성

[시스템 구성]

Untitled

  • 에이전트
    • 클라이언트 상에서 보호대상 프로세스에 대한 디버깅과 메모리 조작 행위 방지
    • 의심가는 행위에 대한 모니터링 데이터 수집
  • 서버
    • 에이전트로부터 데이터를 전송받아 저장 관리
    • 보안 정책 설정

[시스템 주요 기능]

  • Win32 API 사용 패턴을 이용한 악성 프로그램 동작 감지 기능
  • 악성 프로그램의 실행모듈에 대한 해쉬값 생성 및 악성 프로그램 탐지 기능
  • 시스템 와이드 훅을 이용한 메모리 조작 방지 기능
  • 보고된 탐지 패턴 정보를 기반으로 보안 정책 생성 및 적용 기능

[시스템 동작 절차]

Untitled

  • 서비스 시작전 서버로부터 보안 정책을 다운
  • 실행되는 새로운 프로세스의 실행을 감지
  • 프로그램 모듈에 대한 해쉬값 생성
  • 관리 서버로부터 수신된 악성 프로그램에 대한 해쉬값 리스트와 비교 → 악성인지 아닌지 여부 검사
    • 악성이면, 프로세스 보호대상 프로세스 종료
    • 악성이 아니면, continue
  • 보호대상 프로그램으로의 접근 및 사용하는 Win32 API 패턴 분석
    • 메모리 조작일 경우, 보호대상 프로세스 종료 or 악성 프로그램의 메모리 조작을 차단
    • 모니터링 결과를 서버로 전달
    • 프로세스 종료

[시스템 수행에 적용되는 보안 정책]

  • 해시 알고리즘: 프로그램에 대한 해쉬값 생성시 적용
  • 세션 암호화 알고리즘: 에이전트와 서버와의 통신에 적용
  • 차단 대상 프로그램 해시 목록
  • 차단 대상 프로그램 탐지시 보호 대상 프로세스 바로 종료 여부
  • 차단 대상 프로그램 탐지시 대상 프로그램 종료 시도 여부
  • 에이전트 무결성 검사 여부
  • 로그 저장 방법

3.3 통신 프로토콜

에이전트와 관리 서버간에 송수신 되는 모든 데이터는 암호화 전송으로 이루어짐 → 프로토콜의 정의가 필요!

[통신 프로토콜]

Untitled

→ 처리되는 분리자는 “$”를 사용

→ 특정 필드의 값이 정의되어 있지 않을 경우 분리자를 “$$”와 같이 연속해서 표시함

3.4 에이전트

에이전트

  • 에이전트는 보호대상 프로세스와는 별개의 프로그램으로 동작할 수 있음
  • DLL로 제공되어 보호대상 프로세스가 동적으로 사용 가능

[에이전트 모듈 구성과 기능]

구성 기능
해쉬 생성 모듈 MD5를 이용한 실행 파일에 대한 해쉬값 생성
( h = md5[.exe]
조작에 대한 탐지 및 방지 모듈 Win32 API 패턴기반의 프로세스에 대한 악의적 접근 및 메모리 조작 탐지/차단
분석 방지 모듈 보호대상 프로그램에 대한 디버거, 치터 등의 동작을 탐지
전송 모듈 수집한 데이터를 서버로 전송
( hash

[에이전트 동작 절차]

  1. 보안 정책을 초기화한다.

  2. 실행 프로그램에 대한 해쉬값을 생성한다.

  3. 해쉬값 비교후 차단대상 프로그램인지를 검사한다.

    → 차단대상 프로그램일 경우 프로세스에 대한 정보를 관리서버로 전송하고 보호대상 프로세스를 종료한다.

  4. 보호대상 프로세스로의 접근과 디버거 동작을 탐지한다.

    → 디버거가 동작이 탐지되면 디버거가 가지는 프로세스 정보를 관리서버로 전송하고 보호대상 프로세스를 종료한다.

  5. 사용하는 API 패턴과 파라미터를 분석한다.

  6. 보호대상 프로세스에 대한 메모리 조작 여부를 검사한다.

    → 메모리 조작이 탐지되면 시스템 와이드 훅을 이용하여 메모리 조작에 사용되는 Win32 API 를 차단하고 프로세스 정보를 관리서버로 전송하며 보호 대상 프로세스를 종료한다.

[프로세스 후킹 구조]

Untitled

  • 보호대상 프로세스에 대한 메모리 조작 판단 여부를 검사하기 위해 사용되는 후킹은 시스템 와이드 후킹의 기본 요구 사항을 충족시키기 위해 보통 DLL로 구현됨
  • 후킹은 기본적으로 후킹 콜백 프로시저가 시스템 상에서 후킹된 각각의 프로세스 공간에서 실행됨
  • 에이전트는 로더 프로세스가 접근하는 프로세스가 보호대상 프로세스인지 판단 후, 로더가 호출하는 Win32 API에 대해 모니터링함
  • 메모리 조작으로 판단될 경우, 시스템 와이드 훅을 이용하여 로더가 사용하는 Win32 API 기능을 무력화하여 메모리 조작을 사전에 방지

[분석 도구의 탐지를 위한 방법]

  • 분석도구가 사용하는 고유 캡션 스트링(Caption String)과 실행파일 이름 비교
  • 분석 도구의 사용으로 인해 발생하는 특정 인터럽트 등을 모니터
  • FindWindow API를 이용한 분석도구의 윈도우 정보 비교
  • CreateToolhelp32Snapshot, Process32First/Next API 이용하여 분석도구 프로세스가 사용하는 힙, 모듈, 쓰레드 정보 비교
  • SetUnhandledExceptionFilter API를 이용한 예외처리 핸들러 이용
  • IsDebuggerPresent API를 이용한 디버거 동작 여부 감지
  • 분석 도구가 사용하는 고유 메모리 영역 및 파일 정보 비교

[프로세스명을 비교하는 방법]

  • 기존에 실행되고 있는 프로세스명을 얻어오기

  • 새로 실행되는 프로세스명을 별도로 관리하고 필터링하여 실행여부 결정

    → 관리 대상 프로세스나 인가되지 않은 새로운 프로세스의 경우 보안 정책 설정에 따라 실행중인 프로세스 자체를 종료시킬 수 있음

[전송 모듈]

  • 클라이언트 시스템 상에서 에이전트가 수집한 데이터들에 대한 전솜 담당
  • 전송되는 데이터
    • 프로그램 실행 모듈 해쉬값
    • 실행 모듈 및 프로세스 이름
    • 프로그램의 캡션 스트링 및 클래스 이름
    • Win32 API 사용 데이터

3.5 관리 서버

서버

  • 에이전트를 업데이트
  • 탐지된 데이터를 바탕으로 새로운 보안 관리 정책 생성하여 개별 에이전트에 배포
  • 메모리 조작과 같은 악의적인 접근에 대해 에이전트로부터 보고된 데이터에 대한 이벤트 로그 및 위험도를 바탕으로 악성 프로세스 여부를 판단
  • 악성 프로세스로 판단시 이를 데이터베이스에 저장
    → 에이전트에게 해당 패턴 정보 및 보안 정책 배포
    → 추후 동일한 악성 프로세스가 재실행 되었을 경우에 바로 강제종료하도록 메모리 조작을 사전에 방지

[관리 서버 구조]

Untitled

  • Admin 모듈
    • 전송 및 DB 모듈을 초기화 및 구동
    • GUI 형태로 제공되는 관리도구와 연동하여 데이터베이스에 저장된 내용에 대한 통계 및 내역 조회
    • 새로 부가된 정책을 적용
  • 전송 모듈
    • 에이전트로부터 수집된 데이터를 수신
    • 새로운 보안 정책을 에이전트에게 전송
  • DB 모듈
    • 수집된 데이터를 저장 및 관리 하는 기능

4. 결론

문제점

  • 다수의 소프트웨어들이 단순한 프로텍션 모델을 가지고 있음
  • 프로텍션 모듈 자체도 보호되고 있지 않음

요구사항

  • 완성도 높은 소프트웨어 개발
  • 안전하게 지적재산권을 보호하기 위한 노력

해결방안

  • 윈도우 환경에서의 메모리 해킹 방지 시스템
    • 관리 서버에서 설정한 보안 정책에 따라 에이전트가 운영되며 에이전트에서는 보안 정책을 기반으로 프로그램 실행 모듈에 대한 해쉬값을 비교하고, Win32 API 사용 패턴과 파라미터를 분석하여 프로세스들에 대한 동작을 감시하고 탐지함
    • 모든 윈도우 플랫폼에 적용 가능
    • 웹 하드 클라이언트 프로그램에 대한 메모리 조작에 대응 가능

향후 방향

  • 구체적인 시스템 운영 및 보안 정책 수립
  • 보안 정책을 적용한 기본 시스템 구현과 실험
728x90