기본 정보
논문 저자: 김요식 , 윤영태, 박상서
게재처: 정보보증논문지
연도: 2005
요약: 역공학(Reverse Engineering) 기술이 진보함에 따라 컴퓨터 소프트웨어에 대한 불법 조작 및 변조 등의 위협이 증가하고 있으며, 인터넷에 공개된 단순한 도구를 이용하여 누구나 쉽게 크래킹(Cracking)을 할 수 있게 되었다. 자사의 소프트웨어를 위협으로부터 방어하고자 하는 제작사들의 노력과 이를 무력화시키고자 하는 소위 크래커들의 노력은 지금까지도 계속되고 있다. 이에 본 논문에서는 소프트웨어가 가지는 위협 모델과 크래킹 기술에 대해 분석 및 실험하고, 소프트웨어를 위협으로부터 보호하기 위한 윈도우 환경에서의 메모리 해킹 방지 시스템을 제안한다.
주제: Malware, reverse engineering, software security
1. 서론 및 배경지식
저작권을 보호 하기 위한 기술
사용자에게 등록번호를 입력하도록 하고 올바른 등록번호 여부를 검사하는 방법
= 시리얼 넘버, 라이센스 넘버
소프트웨어에 보이지 않는 워터마크 주입하기
→ “소프트웨어에 비밀리에 정보를 삽입하는 절차”
(Java 프로그램에 적용가능한 소프트웨어 워터마킹 참고)
정보: 소프트웨어의 소유권을 구별할 수 있는 정보
→ 저작권자가 소프트웨어에서 비밀정보를 추출함으로써 허가되지 않은 소프트웨어 복제를 증명하는 수단으로 활용
1) 저작권 보호
2) 소프트웨어 실행 무결성 보장
3) 실행 파일에 대한 접근 제어
하드웨어를 접목시켜 소프트웨어를 보호하는 기술
→ 동글
본 논문의 내용
2장
- 소프트웨어가 가지는 위협 모델 분석하여 문제점 도출
- 소프트웨어에 대한 크래킹 방법에 대한 예
3장
- 소프트웨어를 위협으로부터 보호할 수 있는 대응책
- 윈도우 환경에서의 메모리 해킹 방지 시스템 제안
4장
- 결론 및 향후 방향 제시
2. 소프트웨어 크래킹 기술
2.1 위협 모델
크래킹으로 인해 발생하는 문제
소프트웨어 위협 모델
- 모니터링: 내부 비밀 데이터가 누출될 수 있음
- 역공학: 로직을 추출하여 분석할 수 있음
- 소프트웨어 해적판(Software Piracy): 로직을 임의 조작하여 복사본을 만들거나 패키지 전체를 무작위로 재배포 할 수 있음
- 탬퍼링: 로직을 임의 조작하여 프로그램의 흐름을 초기 제작 의도와는 다르게 위/변조가 가능
(임베디드 안티 템퍼링 기술 참고: https://coontec.kr/anti-tampering/)
2.2 크래킹 기술
단순 등록번호: 등록키(Registration Key), 다중 일련번호(Multiple Serials)
등록번호를 비교하는 코드상의 분기문을 수정
→ 아예 비교하는 분기문을 실행하지 않고 바로 프로그램이 실행되게 점프!
디버깅을 통해 하드코딩된 등록번호 알아내기
→ 메모리에 들어있는 등록번호 리버싱으로 확인 가능
등록번호를 생성하는 알고리즘을 분석하여 등록번호만을 전문적으로 생성하는 프로그램을 제작할 수 있음
→ NuGet 시리얼키 생성기 만들어본거 생각해보기!!
→ 아예 시리얼키 비교 과정을 분석해서 통과할 수 있게 시리얼키 생성기 만들수도 있고, 아니면 시리얼키를 내부에서 입력값으로 생성후 비교하는 과정이면 코드를 반대로 짜서 크래킹 가능 (https://lucykorea414.tistory.com/7 참고!)
패커에 의해 압축/암호화되어 있는 코드
메모리상에서 언패킹 되어 실행된다는 취약점 이용 → 패커 기능 무력화 가능
동글(Dongle): 하드웨어를 접목하여 부속시키는 방법
- 위조된 드라이버를 제작
- 별도의 에뮬레이터를 이용하여 동글 없이도 소프트웨어를 동작할 수 있음
2.3 크래킹 방법
2.3.1 내그 스크린 무력화
일반적으로 다이얼로그를 출력하기 위해 Win32API 를 사용
- GetSystemTime
- GetLocalTime
- GetTickCount
→ bp 설정하여 분석
[Helios 사의 TextPad ver4.7]
- (bp)004055C7 - GetTickCount API: 내그 스크린이 시작되어 경과된 시간을 밀리초 단위로 리턴
- 내그 스크린을 화면상에 출력하는 부분은 앞부분으로 유추 가능!
- 내그 스크린의 윈도우 호출 여부를 결정하는 조건도 앞부분으로 유추 가능!
- 004055A5 - 호출문: 내그 스크란을 호출하는 구문
- 등록 버전의 경우 내그 스크린을 호출하지 않는 위치인 004055D3으로 점프
- 비등록 버전의 경우 내그 스크린 호출(점프 하지 않고 밑줄로 그대로 실행)
- 004055AD - 점프문: 내그 스크린의 호출 여부 결정짓는 조건 분기문
- 여기서
JE(74 24)
→JMP(EB 24)
로 1 바이트만 수정하여 패치하면 비등록 버전의 경우에도 내그 스크린 호출되지 않음
- 여기서
2.3.2 프로세스 패치
인터넷을 통해 배포되는 프로그램들의 보안기능
- 패커 사용: 프로텍션 기능의 일환
- 디버거 자동 감지 기능 포함: 프로그램 바이너리에 대한 역공학(리버싱) 방지
[Helios 사의 TextPad ver4.7]
→ TextPad를 UPX 패킹하였음
→ 언팩 과정: 패커를 통해 압축/암호화된 코드는 메모리 상에서 프로그램을 수행하기 위해 언팩 과정을 수행함
→ 언팩 과정을 거치면서 패킹된 프로그램 엔트리 포인트(PEP, Program Entry Point)에서 언팩된 엔트리 포인트로 분기
→ 패커의 마지막 부분에 원래의 TextPad.exe가 가지는 프로그램 엔트리 포인트인 004BD302로 점프하는 구문이 포함
→ UPX를 통해 압축/암호화를 수행해도, 프로그램 원래의 엔트리 포인트와 1 바이트 패치를 통해 내그 스크린을 무력화시킨 코드의 메모리상의 위치에는 변화가 없음을 의미
→ 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 로더를 이용한 패치
[로더를 이용한 기본적인 패치 절차]
→ 패치 벡터 초기화: 대상 프로그램이 정해지면 디버거 등을 통해 대상 프로그램을 분석하여 패치하고자 하는 주소 위치와 변경할 데이터 등을 초기화하는 과정
→ 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
- 윈도우 시스템의 레지스트리 모니터링 도구
- 특정 응용프로그램이 레지스트리에 접근하여 읽고 쓰는 상황을 실시간으로 모니터링
- Filemon
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를 역어셈블한 코드 일부]
→ User32.dll 내의 FindWindow를 이용하여 접근 대상 프로세스의 핸들을 얻어옴
→ GetWindowThreadProcessId에 의해 프로세스 ID 획득
→ OpenProcess, VirtualProtectEx, WriteProcessMemory, CloseHandle API를 호출하여 대상 프로세스가 가지는 특정 위치의 메모리를 조작함
[본 논문에서 제시하는 대응책]
악성 프로그램의 Win32 API 사용 패턴과 실행 모듈에 대한 해쉬 검증
시스템 와이드 훅(System Wide Hook)이용
$\therefore$ 클라이언트 시스템상에서 메모리를 조작하는 악성 소프트웨어 모니터 & 임의 조작 방지 하는 시스템 제안
3.2 시스템 구성
[시스템 구성]
- 에이전트
- 클라이언트 상에서 보호대상 프로세스에 대한 디버깅과 메모리 조작 행위 방지
- 의심가는 행위에 대한 모니터링 데이터 수집
- 서버
- 에이전트로부터 데이터를 전송받아 저장 관리
- 보안 정책 설정
[시스템 주요 기능]
- Win32 API 사용 패턴을 이용한 악성 프로그램 동작 감지 기능
- 악성 프로그램의 실행모듈에 대한 해쉬값 생성 및 악성 프로그램 탐지 기능
- 시스템 와이드 훅을 이용한 메모리 조작 방지 기능
- 보고된 탐지 패턴 정보를 기반으로 보안 정책 생성 및 적용 기능
[시스템 동작 절차]
- 서비스 시작전 서버로부터 보안 정책을 다운
- 실행되는 새로운 프로세스의 실행을 감지
- 프로그램 모듈에 대한 해쉬값 생성
- 관리 서버로부터 수신된 악성 프로그램에 대한 해쉬값 리스트와 비교 → 악성인지 아닌지 여부 검사
- 악성이면, 프로세스 보호대상 프로세스 종료
- 악성이 아니면, continue
- 보호대상 프로그램으로의 접근 및 사용하는 Win32 API 패턴 분석
- 메모리 조작일 경우, 보호대상 프로세스 종료 or 악성 프로그램의 메모리 조작을 차단
- 모니터링 결과를 서버로 전달
- 프로세스 종료
[시스템 수행에 적용되는 보안 정책]
- 해시 알고리즘: 프로그램에 대한 해쉬값 생성시 적용
- 세션 암호화 알고리즘: 에이전트와 서버와의 통신에 적용
- 차단 대상 프로그램 해시 목록
- 차단 대상 프로그램 탐지시 보호 대상 프로세스 바로 종료 여부
- 차단 대상 프로그램 탐지시 대상 프로그램 종료 시도 여부
- 에이전트 무결성 검사 여부
- 로그 저장 방법
3.3 통신 프로토콜
에이전트와 관리 서버간에 송수신 되는 모든 데이터는 암호화 전송으로 이루어짐 → 프로토콜의 정의가 필요!
[통신 프로토콜]
→ 처리되는 분리자는 “$”를 사용
→ 특정 필드의 값이 정의되어 있지 않을 경우 분리자를 “$$”와 같이 연속해서 표시함
3.4 에이전트
에이전트
- 에이전트는 보호대상 프로세스와는 별개의 프로그램으로 동작할 수 있음
- DLL로 제공되어 보호대상 프로세스가 동적으로 사용 가능
[에이전트 모듈 구성과 기능]
구성 | 기능 |
---|---|
해쉬 생성 모듈 | MD5를 이용한 실행 파일에 대한 해쉬값 생성 |
( h = md5[.exe] | |
조작에 대한 탐지 및 방지 모듈 | Win32 API 패턴기반의 프로세스에 대한 악의적 접근 및 메모리 조작 탐지/차단 |
분석 방지 모듈 | 보호대상 프로그램에 대한 디버거, 치터 등의 동작을 탐지 |
전송 모듈 | 수집한 데이터를 서버로 전송 |
( hash |
[에이전트 동작 절차]
보안 정책을 초기화한다.
실행 프로그램에 대한 해쉬값을 생성한다.
해쉬값 비교후 차단대상 프로그램인지를 검사한다.
→ 차단대상 프로그램일 경우 프로세스에 대한 정보를 관리서버로 전송하고 보호대상 프로세스를 종료한다.
보호대상 프로세스로의 접근과 디버거 동작을 탐지한다.
→ 디버거가 동작이 탐지되면 디버거가 가지는 프로세스 정보를 관리서버로 전송하고 보호대상 프로세스를 종료한다.
사용하는 API 패턴과 파라미터를 분석한다.
보호대상 프로세스에 대한 메모리 조작 여부를 검사한다.
→ 메모리 조작이 탐지되면 시스템 와이드 훅을 이용하여 메모리 조작에 사용되는 Win32 API 를 차단하고 프로세스 정보를 관리서버로 전송하며 보호 대상 프로세스를 종료한다.
[프로세스 후킹 구조]
- 보호대상 프로세스에 대한 메모리 조작 판단 여부를 검사하기 위해 사용되는 후킹은 시스템 와이드 후킹의 기본 요구 사항을 충족시키기 위해 보통 DLL로 구현됨
- 후킹은 기본적으로 후킹 콜백 프로시저가 시스템 상에서 후킹된 각각의 프로세스 공간에서 실행됨
- 에이전트는 로더 프로세스가 접근하는 프로세스가 보호대상 프로세스인지 판단 후, 로더가 호출하는 Win32 API에 대해 모니터링함
- 메모리 조작으로 판단될 경우, 시스템 와이드 훅을 이용하여 로더가 사용하는 Win32 API 기능을 무력화하여 메모리 조작을 사전에 방지
[분석 도구의 탐지를 위한 방법]
- 분석도구가 사용하는 고유 캡션 스트링(Caption String)과 실행파일 이름 비교
- 분석 도구의 사용으로 인해 발생하는 특정 인터럽트 등을 모니터
- FindWindow API를 이용한 분석도구의 윈도우 정보 비교
- CreateToolhelp32Snapshot, Process32First/Next API 이용하여 분석도구 프로세스가 사용하는 힙, 모듈, 쓰레드 정보 비교
- SetUnhandledExceptionFilter API를 이용한 예외처리 핸들러 이용
- IsDebuggerPresent API를 이용한 디버거 동작 여부 감지
- 분석 도구가 사용하는 고유 메모리 영역 및 파일 정보 비교
[프로세스명을 비교하는 방법]
기존에 실행되고 있는 프로세스명을 얻어오기
새로 실행되는 프로세스명을 별도로 관리하고 필터링하여 실행여부 결정
→ 관리 대상 프로세스나 인가되지 않은 새로운 프로세스의 경우 보안 정책 설정에 따라 실행중인 프로세스 자체를 종료시킬 수 있음
[전송 모듈]
- 클라이언트 시스템 상에서 에이전트가 수집한 데이터들에 대한 전솜 담당
- 전송되는 데이터
- 프로그램 실행 모듈 해쉬값
- 실행 모듈 및 프로세스 이름
- 프로그램의 캡션 스트링 및 클래스 이름
- Win32 API 사용 데이터
3.5 관리 서버
서버
- 에이전트를 업데이트
- 탐지된 데이터를 바탕으로 새로운 보안 관리 정책 생성하여 개별 에이전트에 배포
- 메모리 조작과 같은 악의적인 접근에 대해 에이전트로부터 보고된 데이터에 대한 이벤트 로그 및 위험도를 바탕으로 악성 프로세스 여부를 판단
- 악성 프로세스로 판단시 이를 데이터베이스에 저장
→ 에이전트에게 해당 패턴 정보 및 보안 정책 배포
→ 추후 동일한 악성 프로세스가 재실행 되었을 경우에 바로 강제종료하도록 메모리 조작을 사전에 방지
[관리 서버 구조]
- Admin 모듈
- 전송 및 DB 모듈을 초기화 및 구동
- GUI 형태로 제공되는 관리도구와 연동하여 데이터베이스에 저장된 내용에 대한 통계 및 내역 조회
- 새로 부가된 정책을 적용
- 전송 모듈
- 에이전트로부터 수집된 데이터를 수신
- 새로운 보안 정책을 에이전트에게 전송
- DB 모듈
- 수집된 데이터를 저장 및 관리 하는 기능
4. 결론
문제점
- 다수의 소프트웨어들이 단순한 프로텍션 모델을 가지고 있음
- 프로텍션 모듈 자체도 보호되고 있지 않음
요구사항
- 완성도 높은 소프트웨어 개발
- 안전하게 지적재산권을 보호하기 위한 노력
해결방안
- 윈도우 환경에서의 메모리 해킹 방지 시스템
- 관리 서버에서 설정한 보안 정책에 따라 에이전트가 운영되며 에이전트에서는 보안 정책을 기반으로 프로그램 실행 모듈에 대한 해쉬값을 비교하고, Win32 API 사용 패턴과 파라미터를 분석하여 프로세스들에 대한 동작을 감시하고 탐지함
- 모든 윈도우 플랫폼에 적용 가능
- 웹 하드 클라이언트 프로그램에 대한 메모리 조작에 대응 가능
향후 방향
- 구체적인 시스템 운영 및 보안 정책 수립
- 보안 정책을 적용한 기본 시스템 구현과 실험
'study > 논문' 카테고리의 다른 글
[논문] 키 재사용 공격을 통한 Ragnar Locker 랜섬웨어 감염 파일 복호화 및 활용 방안 연구 (0) | 2024.05.19 |
---|---|
[논문] 단편화된 실행파일을 위한 데이터 구조 역공학 기법 (0) | 2023.10.01 |
논문 읽는 법 (0) | 2023.09.07 |