목차

1. 악성코드 정적 탐지 프로그램 

1.1 분석 사용도구 

1.2 분석 목적 

1.3 수행 기간 

1.4 결과 

1.5 악성코드 탐지 제작 

1.5.1 C언어 소스코드 


프로젝트명

악성코드 정적 탐지 프로그램

수행기간

20

사용 도구

Microsoft Visual Studio 2010 - C언어

목적

정적패턴을 통하여 악성코드 탐지

1.결과

- 만들면서 여러 가지 오류가 많았고 오류의 수정에 대해 중점을 두었지만 아직까진 미흡한 부분이 있습니다. 검사파일 용량이 너무 많을 경우 속도가 오래 걸리는 단점이 있어서 이 점을 보완하기 위하여, 검사할 수 있는 파일용량 사이즈를 임의로 정한 사이즈 수까지 나눠서 검사하도록 하였지만, 악성코드의 패턴이 제가 정한 사이즈의 범위에 있다는 전제 하에 탐지하는 방식이기에 범위를 벗어난 악성코드 패턴인식은 불가능하다는 점입니다.

<!--[if !supportEmptyParas]--> <!--[endif]-->

- Suicide.bat, Sxstrace.exe, SystemPropertiesRemote.exe 이 세 개의 프로그램을 악성코드로 지정하고 패턴을 저장시킵니다.

- Suicide.bat 감지 패턴 77 73 63 72 69 70 74 2e 65 78 65


- Sxstrace.exe 감지 패턴 45 6e 61 62 6c 65 54 72 61 63 65 45 78


- SystemPropertiesRemote.exe 감지 패턴 53 79 73 74 65 6d 50 72 6f 70 65 72 74 69 65 73 52 65 6d 6f 74 65 2e 70 64 62


- 악성코드 탐지 파일목록


- 악성코드 검사 대상 파일 목록

(지정된 악성코드 파일들을 제외한 나머지 파일들은 Windows 파일)


- 악성코드 검사

 

2.악성코드 탐지 구조

<!--[if !supportEmptyParas]--> <!--[endif]-->

- 재귀 함수를 통하여 디렉토리 구분을 하고 하위 디렉토리까지 검사가 가능하며, 탐지 방식은 16진수 패턴을 만들어 탐지합니다.

- 검사 대상의 파일 사이즈를 얻어고 사이즈의 크기만큼 cch1,cch에 동적으로 할당해줌 cch1,cch는 임의로 크기를 지정하기엔 너무 많은 빈공간이 발생 또는 공간이 부족할 수도 있다고 생각하여 동적으로 할당함

- 패턴.txt 안에 담겨진 비교할 16진수 패턴 내용을 buffer에 동적 할당을 합니다.


- 사이즈 크기가 55000바이트를 넘어가버리면 시간이 너무 오래 걸리게 되어버려서 사이즈 체크를 함 55000바이트 미만일 경우 정상 작동 ch에 검사대상파일의 한 문자열을 정수형으로 바꿔서 적용 strcat함수를 이용하여 itoa는 진수 변환시켜주는 함수이며 정수인 ch16진수로 cch에 저장 cch에 저장된 하나의 문자열 16진수를 cch1에 문자열 하나하나씩 연결 해주어 검사대상 사이즈의 모든 데이터가 cch1에 저장되도록 함


- strstr 함수는 문자열 검색을 도와주는 함수로서 buffer 패턴내용을 cch1 검사대상 데이터중에 존재하는지 검색하고 존재하지 않는다면 NoVirusCh 설정을 통하여 감염되지 않았다는 메시지 전달.


- 위에 대상파일이 55000 이상일 경우 for문을 통하여 사이즈 크기를 50000미만일때가지 나누고 나눈 사이즈 만큼 문자열 데이터를 cch1에 연결하여 악성코드 패턴을 이용하여 위와 같이 반복




블로그 이미지

_B_G_

,


목차


1. Thread Injection & API 후킹 코드패치 

1.1 분석 사용도구 

1.2 분석 목적 

1.3 수행 기간 

1.4 Thread Injection&API 후킹 코드패치 

1.4.1 Thread Injection이란? 

1.4.2 DLL Injection/Thread Injection 그림설명 

1.4.3 Notepad.exe API후킹 코드패치 동작설명 

1.4.4 Notepad.exe API WriteFile함수 분석 

1.4.5 Thread Injection 코드 작성 

1.4.6 Thread Injection & API 코드패치 Hooking 결과 

 

2. 메모리 변조 탐지 프로그램 

2.1 분석 사용도구 

2.2 분석 목적 

2.3 수행 기간 

2.4 메모리 변조 탐지 프로그램 

2.4.1 메모리 보호 기능 및 구조 설명 

2.4.2 메모리 변조 탐지 

2.4.3 안티 디버그 

2.4.4 안티 DLL인젝션 

2.4.5 결론 


프로젝트명

Thread Injection&API 후킹 코드패치

수행기간

7

사용 도구

Microsoft Visual Studio 2010 C언어, CheatEngine6.6

목적

Thread Injection 공격방식을 알기위함

1.Thread Injection 이란?


- 주로 Code Injection 이란 용어로도 불리고 있는데 같은 의미라고 보여집니다. 먼저 같은 Injection 방법인 DLL Injection 설명을 드리자면 Injectior.exe에서 DLL을 주입하기 위하여 대상프로세스에 쓰레드공간 할당을 받고 할당받은 공간에 미리 작성해둔 Injection시킬 DLL경로를 입력하게됩니다

그리고 빈공간에 작성한 쓰레드를 실행 하기 위해선 CreateRemoteThread 함수를 사용하여 LoadLibrary 함수 주소를 강제로 실행함과 동시에 DLL 경로작성을 한 쓰레드 공간을 실행합니다

하지만 DLL Injection은 무조건 LoadLibrary 함수를 이용하여 작성을 하기 때문에 흔적이 남기 쉽고 DLL 또한 눈에 보이게 됩니다

하지만 Thread Injection은 단순히 코드만 인젝션 시키기 때문에 흔적을 찾기가 어렵고 사용또한 DLL Injection 보단 복잡합니다

그럼 Thread Injection의 방법을 말하자면 

1. DLL Injection -> EXE -> 쓰레드 공간할당/생성 -> LoadLibrary 함수실행 -> DLL경로 쓰레드 실행 -> DLL 기능 작동 이라면 

2. Thread Injection -> EXE -> 쓰레드 공간할당/생성 -> 쓰레드실행 -> 기능작동 이라고 볼수 있습니다

DLL인젝션은 DLL을 통해 기능 작동이되지만 Thread InjectionLoadLibrary 함수를 넣는게 아니라 처음부터 자신이 원하는 API,구조체를 일일이 작성하여 실행될 Thread를 바로 넣어버리기 때문에 흔적이 남지 않습니다.


2.DLL Injection/Thread Injection 그림설명

[DLL Injection]


[Thread Injection]


3. Notepad.exe API후킹 코드패치 동작설명


- 대상 프로그램 Notepad.exe (메모장)은 내용물을 저장을 할 수 있습니다. 이 내용물을 저장하는 API부분을 Thread Injection을 사용하여 코드패치 한 후 다른 내용으로 저장을 하게끔 해보겠습니다.


4. Notepad.exe API WriteFile함수 분석

- WriteFile 함수에 브레이크 포인터를 걸고 내용을 “save save save” 적고 저장

- 현재 스택들이 쌓인곳을 알려주는 ESP 레지스터 주소를 찾아 들어감 메모장 내용은 쌓인지 얼마 안됬을거라 추측을 하고 4바이트씩 하나 하나 30 4C 00 01 -> 01004C30 형식으로 바꿔가며 해당 어드레스 값들을 찾아본 결과 파랑색 어드레스 안에서 발견



- 파랑색 D8 61 47 05 -> 054761D8로 변경후 어드레스 확인하니 저장되는 내용을 볼수 있습니다. 이러한 과정을 Thread Injection을 사용하여 WriteFile 후킹 및 내용 변경까지 해보겠습니다.


5. Thread Injection 코드 작성

- WriteProcessMemory API 재정의 , 파라메터 값 저장하는 곳 생성

- 파라메터 정보를 재정의해준 API에 전달 , 후킹하여 inline 어셈이 작동하도록 작성. ESP안에서의 저장되는 내용물을 가져왔기 때문에 ESP 주소부터 시작

- API에게 전달하여야 하는 파라메터값에게 저장 jmp xxxxxxxx 변경해줄 주소 지정

- 각 쓰레드 인젝션 및 실행

6. Thread Injection & API 코드패치 Hooking 결과


- 정상적으로 작성 및 실행



프로젝트명

메모리 변조 탐지 프로그램

수행기간

4

사용 도구

Microsoft Visual Studio 2010 C언어, 핀볼게임, DLL , CheatEngine6.5

목적

메모리 변조 탐지를 위해 어떤 방법들이 있는지 알기 위함

1.메모리 보호 기능 및 구조 설명


- 메모리 보호 대상을 핀볼게임(PINBALL.EXE)으로 하였습니다.

메모리 변조가 가능할 경우 PINBALL.EXE+13C98 = 핀볼 점수에 관한 주소값을 자신만의 코드로 점프 시킨 후 점수를 받는 ECX 레지스터를 9999999 점수로 조작이 가능하게 됩니다.

이런 메모리 변조를 탐지하며 DLL인젝션을 통하여 메모리변조 가능성도 막기 위하여 감지하며, 디버깅 기능 또한 탐지.


2.메모리 변조 탐지

- 메모리 탐지를 할 영역은 PINBALL.EXE로 하였습니다. 해당 프로세스의 모듈 값을 기본 주소로 잡고 모듈 값 기본주소 ~ 기본주소+설정 까지 실행 시키면서 CheckSum을 이용한 결과값을 리턴 시킨후 결과값 = 원본CheckSum값이 일치하는지 확인하는 방식입니다.

- MemoryDetection.h에 실행중인 CheckSum 구하는 중


PINBALL.EXE 모듈값을 먼저 얻어옴

<GetRemoteModuleHandle.h>

PINBALL.EXE ProcessID를 구한 후 CreateToolhe32Snapshot()을 이용하여 모듈을 불러옴 Module32First()modEntry 인자값을 받고 modEntry.hModule EXE모듈값을 구할 수있습니다.


<MemoryDetection.h>

위에서 받아온 모듈값 영역 기반으로 메모리값이 고정인 반면 변조가 되었을 시 손해를 볼 수 있는 구간을 지정 합니다. VirtualQueryEx 대상 프로세스의 메모리 영역 정보를 가져 올수 있으며, 필요없는 값이 들어 있는 메모리 부분을 걸러낼 수 있습니다. MBI.Type 메모리영역 정보를 불러온 타입 정보 중에 IMAGE 페이지 타입 과 MEM_COMMIT 페이지 상태인 것 만 구분 시킵니다. IF문을 지나가게 되면 RPM API를 통하여 해당 어드레스 1바이트의 값을 CheckSum에 저장 시킵니다.



<MemoryHashCMP.h>


CheckSum 리턴값을 받은 후 원본 CheckSum 결과값이랑 일치하는지 판단하여 일치하지 않는다면 디텍터 프로세스와 보호대상 프로세스를 종료 시킵니다.


<변조 전>


<변조 후> 대상 프로세스 종료 메시지창 확인 후 디텍터 프로세스 종료.


3.안티 디버그

 

ZwQueryInformationProcess 함수에서 디버거가 사용되는 0x7 포트를 감지하는 형식으로 해당 프로세스에 0x7 포트가 있는지 판단 후 상황 대처를 하게 됩니다. hProcess를 통하여 보호대상 프로세스를 지정 , GetCurrentProcess()를 사용하여 디텍터 자기 자신 프로세스를 보호


<디버거 사용 전>


<디버거 사용 후>



4.안티 DLL인젝션


어떤식으로 DLL인젝션을 체크하여야 하는지 생각하다가 윈도우에서 지원해주는 기본 DLL들을 걸러낸 후 외부에서 DLL이 들어오게 될 경우 해당 DLL의 모듈값을 구한 후 DLL인젝션에서 주로 사용되는 CreateThread() 함수가 해당 DLL에서 사용이 되는지 확인하는 방식으로 만들었습니다.

그리고 CreateThread()뿐만 아니라 의심가는 API를 해당 DLL에서 호출하는지 확인 후 소스에

추가를 해주면 됩니다.



여기서 사용 된 감지는 ChreateThread() 호출 하는 DLL을 감지를 하겠습니다.

메모리안의 ChreateThreadDLL.dllCreateThread 함수를 호출하는 값이 존재하는지 Window에서 지원하는 DLL을 제외 후 외부에서 인젝션 된 DLL을 검사합니다. 검사 방식은 메모리변조와 동일한 방식으로 검사 할려는 값을 CreateThread 호출 값으로 바꾸었습니다.



CreateThread() 함수를 호출하는 DLL명을 검출 및 해당 주소에서 감지 되었다 문자열이 출력되도록 하였습니다.


5.결론

처음에 시도하였을땐 생각으로만 대충 알고 있었지만 막상 해볼려니 필요한 함수들이 많았습니다. 또 그 해당 함수들의 이해가 필요로 하다보니 이해 할려는 부분에서 시간을 많이 사용 한 것 같습니다. 현재 프로그램에서 추가를 하게 된다면 CheckSum 부분을 암호화 시키는 형식입니다. 암호화 알고리즘은 그나마 사용했었던 디지털 이미지 보안에서의 DES 암호 알고리즘을 추가하거나 일방향 CRC알고리즘을 알아보아야 할 것 같습니다. 그리고 보호프로그램 또한 변조되지 않도록 해시값을 통하여 변조 유무도 추가되어야 하며 안티디버깅 방법들은 많아서 여러 가지를 추가하여도 좋은거 같습니다




블로그 이미지

_B_G_

,

목차

1. IDA Pro를 이용한 모바일 게임 분석 

1.1 분석 사용도구 

1.2 분석 목적 

1.3 수행 기간 

1.4 모바일 게임 분석 

1.4.1 결과 

1.4.2 Level 단계 수정 

1.4.3 버블 Arcade 모드 개수 수정 

1.4.4 대응방안 

 

2. 게임 비인가 매크로 프로그램 

2.1 분석 사용도구 

2.2 분석 목적 

2.3 수행 기간 

2.4 비인가 매크로 프로그램 분석 

2.4.1 결과 

2.4.2 비인가 매크로 프로그램 

2.4.3 분석 

 

프로젝트명

IDA Pro를 이용한 모바일 게임 분석

수행기간

2

분석 사용 도구

IDA Pro 6.9(Demo) , Apk Manager , Hex Editor

분석목적

정적분석에 대해 익숙해지고 모바일 어플리케이션 접근방식을 알기위함

 

1.결과

- Level 단계 수정의 경우 정의된 함수들이 알기쉽도록 되어있어서 찾기가 쉬웠고 JD-GUI

자바 디컴파일러로 보게 되면 자바언어로 그대로 보여지기 때문에 이 점에 대해선 대응방안이 필요함

 

- 버블 Arcade 모드 개수 수정은 정의된 함수명이랑 관련되지 않은 버블 관련 클래스를 찾음 값이 증가 할때마다 기존의 버블 개수에서 없어지는 형태가 발생하고 값 증가 시킬때마다 일정 패턴으로 버블개수를 보내줌 1로 수정 할 경우 기본 개수인 382 = 183 = 9개 이런식으로 점점 없어짐

 

2.Level 단계 수정

 

 

class.dex파일을 불러온뒤 함수들중 gotoNextLevel 함수를

찾아서 들어가게 되면 add-int/lit8인 추가한다는 ARM명령어가 보이고 이게 레벨업 관련 됐다는 것을 알게됨

 

 

위의 add-int/lit8 ARM명령어 주소값인 0001B5C4를 복사하고 dex를 헥스 에디터 이용하여 주소값을 이동함

 

이동 된 주소값을 보게되면 D8 00 00 01 16진수가 보이는데 01부분을 자신이 원하는 레벨값으로 변경해줍니다.

Apk Manager 를 통하여 컴파일과 서명을 다시 해줍니다.

 

3.버블 Arcade 모드 개수 수정

getNewRow에 들어가서 내리다보면 Random_nextInt@II 보이게됨 더블클릭하여 한번 더 들어감.

 

 

그러면 Random_nextInt@II를 사용하게 될 함수가 보이는데 LevelManager_getLevel@LL에 들어감 


v0 , v0 , 1에서 1부분을 위와같이 헥스에디터를 이용하여 2로 수정할시 Arcad모드 처음 시작하는 버블 개수가 줄어듦

 

 

 

4.대응방안

- 우선 공격자들이 분석을 하기 어렵게 하는 것이 우선이라고 생각합니다. 예를들어 위에 “Level” 이란 함수명 하나만 봐도 이 부분은 게임상의 레벨 부분이 관련된 곳을 짐작할수 있고 전체적인 흐름을 읽을 수 있어 취약하다고 보여집니다. 그리고 현재 모바일 게임 서비스 파일들을 보게되면 중요 데이터부분들의 라이브러리를 불러오는 방법을 이용하며, 데이터 라이브러리 파일들을 보안 할 수 있는 파일을 개별적으로 추가되어있습니다. 이처럼 보안할 수 있는 파일을 따로 추가하는 것도 좋을거 같습니다. 보안 기능은 라이브러리 파일들이 변조,손상 되지 않았는지 확인을하며, 데이터를 불법적으로 변조하는 것을 막을 수 있습니다.

 

 

 

 

 

 

   

 

프로젝트명

게임 비인가 매크로 프로그램 분석

수행기간

1

사용 도구

Cheat Engine6.5,AutoHotkey,DIE

목적

비인가 매크로 동작원리를 알기 위함

1.결과

- 해당 비인가 프로그램 컴파일이 오토핫키라는 기반으로 분석하였고 대응방안은 해당 게임의 캐릭터 이미지를 저장 해둔 파일을 외부에서 변경되지 못하도록 감지를 하여야하며, 또한 오토핫키 자체를 감지할수 있도록 단어감지나 기존에 나와있는 Mutex를 통해서 감지하는 최소한의 보안을 하여야 합니다. 오토핫키는 소스가 그대로 보여지게되면 악용이 아니라 편의를 위해서 만들어지는 프로그램들이 제작자가 원치않는 소스 유출이 될수 있으므로 난독화 기능이 필요하며 또한 이를 이용한 악용하는 사람이 있을 수 있습니다.

 

 

2.비인가 매크로 프로그램

- 해당 비인가 매크로 프로그램은 총게임에서 적 인식을 자동으로 하여 에임을 이동시켜 총이 발사되는 원리. 적 인식 방식은 해당 게임의 캐릭터 파일을 열어 캐릭터 머리,,팔 부분의 색깔을 수정하고 화면에서 수정된 색깔을 감지하여 마우스를 이동시키는 스크립트를 적용

 

 

 

3.분석

- 화면인식 매크로 프로그램은 우선 알려진 오토핫키로 제작이 되어진걸로 추측을 하게 되고 DIE 프로그램을 이용하여 해당 프로그램이 패커가 되어있는지 확인을 함

- VMProtect 패커가 되어있고 Ollydbg 올리디버거가 작동되지 않으므로, Cheat Engine6.5를 통해서 동적으로 스크립트를 분석함

 

 

 

 

- 오토핫키로 제작이 되었으면, 프로그램이 실행이 되면서 스크립트 소스가 다시 풀려버리게 됩니다. 이 점을 이용하여 해당 스크립트를 그대로 가져올수 있으며 어떤 식으로 돌아가게되는지 분석이 가능함

 

 

 

- 오토핫키 스크립트가 패커에서 실행될 때 풀려버린 소스를 그대로 가져온 상태

 

- 소스를 보면 제작자가 프로그램 사용 가능/불가능 하도록 설정을 할 수 있도록 했으며, 소스를 가져온 상태의 프로그램이 사용 불가능 상태가 되어도 강제로 사용할 수 있도록 수정이 가능함

 

 - 변조 스킨 다운로드를 통하여 캐릭터 이미지를 수정한 뒤 프로그램 작동이 되는지 알 수 습니다. 밑의 소스대로 화면 해상도, 스캔 범위, 픽셀 위치를 알 수 있으며 수정된 캐릭터의 이미지 색깔대로 픽셀 RGB값을 스캔하여 마우스를 이동 시킴


블로그 이미지

_B_G_

,

CryptAcquireContext

 - CSP (Cryptographic Service Provider) 핸들을 구하는 함수

CryptGenKey

 - RSA 공개키/개인키 핸들을 생성하는 함수

CryptImportKey

 - 외부에 출력되어 있는 RSA 공개키 or 개인키를 이용하여 핸들을 구하는 함수

CryptExportKey

 - RSA 공개키/개인키 핸들을 이용하여 외부로 키를 출력하는 함수

CryptEncrypt

 - RSA 공개키 핸들을 이용하여 대상을 암호화 하는 함수

 

 

블로그 이미지

_B_G_

,

공유기 : 포트 포워딩

 

해당 포트로 접속 하였을시 VM으로 IP를 나누어준 로컬 IP로 포워딩

 

포트 범위 8000으로 현재 외부 IP로 접근 하였을시 VM IP인 192.168.25.6 으로 포워딩

 

블로그 이미지

_B_G_

,


수리카타 폴더 경로 : 

/etc/suricata



chmod -R [777::권한] [디렉토리이름]




블로그 이미지

_B_G_

,

Cuckoo 자체 시스템에서 점수를 매겨줄 수 있는

자체 Cuckoo SandBox 시그너처 업데이트 해야함

(쿠쿠 시그너처를 파이썬으로 되어있음)

https://github.com/cuckoosandbox/community

- CuckooSandBox 시그니처 패치

(venv)$ cuckoo community <-- 명령어 입력 자동 업데이트

 

(venv)$ cuckoo <-- cuckoo 실행

(venv)$ cuckoo web runserver 0.0.0.0:8000 <-- web 실행

 

 

 

Virtual Machine OS 설정

- windows 7 , 32bit 설치

- 오디오 옵션 제거

- 호스트 네트워크로 설정 (네트워크 설정 필요)

- PIL , agent.py , Python - 3개 설치

- 방화벽 , 백신 , UAC 해제

- agent.py 실행

- SnapShot - 이름은 cuckoo1 또는 SnapShot 으로 한다.

(옵션에서는 기본 SnapShot 이란 이름으로 지정되어있다)

 

 

--------------------------------------------------------------------

 

Cuckoo - Yara 적용 방법

 

- Yara Rule 관련 파일

 # /venv/lib/python2.7/site- packages/cuckoo/core/startup.py 

 

startup.py 파일 내부에 init_yara() 함수가 보일 것이다.

해당 함 수 밑에 category = memory 라고 나타나 있는데

이것은 Memory 폴더만 점수 매긴다고 보면 될듯

다른것을 점수 포함 시킬려면..... 소스 수정 필요

 

 

 

- 실제로 점수 반영되는 폴더가 어느것이고 어느 폴더가 탐지 되었을시 표시해주는지

※ 두 가지 폴더가 현재 Cuckoo 시스템 내에 쓰이고 있음 (수정 시 startup.py 파일)

[ Binaries 폴더 ]

- Web Cuckoo 보고서 표시에 Yara 매칭 이름 나타냄 하지만 점수 반영은 없음

[ Memory 폴더 ]

- Web Cuckoo 보고서 표시 안됨 , 하지만 점수 반영은 됨

Yara Rule 작성 시 폴더 두 가지를 다 사용하여야 함

 

 

--------------------------------------------------------------------

 

 

Cuckoo API Open


$ cuckoo api


$ cuckoo api --host 211.55.59.247 --port 8090

명령어로 사용 

curl -F file=@/검사파일경로/파일이름.exe http://localhost:8090/tasks/create/file

 

파이썬 사용

 import requests

 REST_URL = "http://localhost:8090/tasks/create/file"

 SAMPLE_FILE = "/path/to/malwr.exe"

 with open(SAMPLE_FILE, "rb") as sample:

 files = {"file": ("temp_file_name", sample)}

 r = requests.post(REST_URL, files=files)

# Add your code to error checking for r.status_code.

 task_id = r.json()["task_id"]

# Add your code for error checking if task_id is None

 

 

보고서 출력 API

$ curl http://localhost:8090/tasks/report/77(77번 리포트 출력) >> 리포트내용 저장.txt

 

보고서 저장 경로

 

~/.cuckoo/storage/analyses 폴더내에 보고서 저장되어 있음

블로그 이미지

_B_G_

,

1. Open terminal (Ctrl+Alt+T) and run command to add PPA:

sudo apt-add-repository -y ppa:teejee2008/ppa


2. Update system package index and install TimeShift via command:

sudo apt update; sudo apt install timeshift




블로그 이미지

_B_G_

,