부동산, 채권, 주식, 경제흐름 자료를 모아 보는 블로그입니다.

간단한 ShellCode Loader 만들기 본문

Study

간단한 ShellCode Loader 만들기

runardor 2016. 4. 2. 17:35

이번 블로그에 설명할 내용은 간단한 ShellCode Loader를 만들어 보는것입니다.

 

 

ShellCode Loader 작성하게 된 이유 크게 2가지였습니다.

 

1. Plugx 악성코드 분석

 

2. ShellCode PayLoad 분석

 

 

 

PlugX를 간단하게 설명 드리자면 정상 EXE + 악성 DLL + 쉘코드로 구성된 악성코드이며,

 

사용자가 정상 EXE를 실행할 경우 상대경로 참조로 인하여 악성 DLL을 로드하고 악성 DLL은 다시 쉘코드를 로드하여 실행하게 됩니다.

 

 

ShellCode PayLoad분석의 경우 길게 작성된 Shell Code를 만들 경우 제대로 동작하는지 확인을 위해서 작성을 수행하였습니다.

 

 

나중에 정리가 된다면 Visual Studio를 이용하여 Shell Code 작성 및 Shell Code 추출 그리고 디버깅 까지 하는 내용을 포스팅 하겠습니다.

 

 

본론으로 돌아와서 ShllCode Loader를 살펴보겠습니다.

 

 

먼저 ShellCoad Loader를 설명하기 앞서 몇가지 기본되는 지식이 필요합니다.

 

1. 메모리에 대한 이해

 

2. Assemly 언어에 대한 이해

 

 

 

위의 2개 내용으로도 블로그를 쓸 경우 많은 내용을 쓸 있겠지만 ( 추후 시간이 될 경우 관련자료 정리 및 포스팅도 고려를 해보도록  하겠습니다. ) 

 

이미 잘 설명된 블로그나 문서들이 존재하기 때문에 반드시 해당 내용들을 검색하셔서 꼭 보시길 권장드립니다.

 

 

 

소스코드를 보여드리기 앞서 코드를 실행하기 전에 몇가지 주의해야 할 사항을 알려드리겠습니다.

 

 

1. ShellCode는 Assmebly Code의 집합으로 실행되기 전에는 반드시 메모리에 적재가 되어야합니다.

 

2. 적재된 쉘코드의 메모리 속성은 반드시 읽기 / 실행속성이 반드시 포함되어야 합니다. ( 가능하면 All Access 권한으로 주시면 됩니다. 실행속성이 없을 경우 메모리 Acccess Violation이 발생합니다. 추가적으로 쉘코드를 Xor 또는 변경이 필요할 경우는 쓰기속성도 필요합니다. )

 

3. 가능하면 쉘코드 내부에서 프로세스를 종료하는 코드를 넣거나, 쉘코드 종료 Caller쪽에서 프로세스를 종료하는 코드를 넣어주는것이 좋습니다. ( 아닐경우 잘못된 메모리로 Return 되거나 Memory Access Violation 존재할수 있으므로 )

 

 

일단 쉘코드를 올리기위한 메모리 매핑 코드를 보도록 하겠습니다.

 

 

 

 

fileMapping 함수는 특정 파일 path를 받아 파일내용을 메모리에 매핑시킨 이후 매핑된 주소를 리턴해줍니다.

 

 

코드상 주의해야할 부분은 설명드리면서 넘어가겠습니다.

 

 

파일 Mappaing에 대해 이미 알고 계시는분은 간단하게 Main코드만 잠깐 보시면 됩니다.

 

 

CreateFile 함수의 경우 Read가 가능한 속성으로 열어주시면 됩니다. 다른속성들은 크게 상관없습니다.

 

 

CreateFileMapping 함수부터가 굉장히 중요합니다.

 

 

함수 원형은 아래와 같습니다.

 

HANDLE WINAPI CreateFileMapping(
  _In_     HANDLE                hFile,
  _In_opt_ LPSECURITY_ATTRIBUTES lpAttributes,
  _In_     DWORD                 flProtect,
  _In_     DWORD                 dwMaximumSizeHigh,
  _In_     DWORD                 dwMaximumSizeLow,
  _In_opt_ LPCTSTR               lpName
);

첫번째 인자는 CreateFile로 생성된 파일핸들을 주면됩니다.

 

그리고 3번째 인자가 정말 !! 중요합니다.

 

CreateFileMapping( hFileHandle, NULL, PAGE_EXECUTE_READWRITE, 0, 0, NULL );

 

제가 위에서 "적재된 쉘코드의 메모리 속성은 반드시 읽기 / 실행속성이 반드시 포함 " 이라는 문장을 쓴 이유입니다.

 

PAGE_EXECUTE_READWRITE : 매핑되는 메모리의 속성이 실행 / 읽기 / 쓰기 속성이 부여된 메모리를 매핑하는것으로 이해하시면 됩니다.

 

 

CreateFileMapping 함수가 정상적으로 수행되면, Mapping 오브젝트가 생성됩니다.

 

주의해야할 점은 CreateFileMapping 함수가 수행되면 실제 파일이 메모리에 매핑되는것이 아니라 매핑을 위한 객체가 생성됩니다.

 

 

이후 매핑 오브젝트를이용해서 메모리에 매핑해야할 작업이 남았습니다.

 

 

메모리에 매핑 해주는 함수는 MapViewOfFile 함수입니다.

 

함수 원형은 아래와 같습니다.

 

LPVOID WINAPI MapViewOfFile(
  _In_ HANDLE hFileMappingObject,
  _In_ DWORD  dwDesiredAccess,
  _In_ DWORD  dwFileOffsetHigh,
  _In_ DWORD  dwFileOffsetLow,
  _In_ SIZE_T dwNumberOfBytesToMap
);

CreateFileMapping 함수를 호출해서 나온 Mapping Object를 첫번째 인자로 준 이후 2번째 인자로 해당 메모리의 Access 권한 정보를 줍니다.

 

MapViewOfFile( hMapHandle, FILE_MAP_ALL_ACCESS, NULL, NULL, NULL );

 

예제로 준 Memory 권한은 모든 권한을 주었으며, 실행 / 읽기 / 쓰기 권한이 부여가 됩니다.

 

 

여기서 주의해야할 점이 한가지 더 있습니다.

 

MSDN에서도 언급되어 있지만 FILE_MAP_ALL_ACCESS의 경우 CreateFileMapping 함수에서 READWRITE / EXCUTE_READWRITE일 경우에만 사용이 가능합니다.

 

A read/write view of the file is mapped. The file mapping object must have been created with PAGE_READWRITE or PAGE_EXECUTE_READWRITE protection.

When used with the MapViewOfFile function, FILE_MAP_ALL_ACCESS is equivalent to FILE_MAP_WRITE.

 

CreateFileMapping 함수의 3번째 인자와 MapViewOfFile의 인자에 제대로된 인자값을 주지 못하면 실행중 메모리 에러가 나거나, 함수가 Error를 방출하게 됩니다.

 

 

모든 함수가 수행이 될 경우 제가 만든 fileMapping 함수는 파일 내용이 매핑된 메모리 주소를 리턴하게 됩니다.

 

 

이제 메모리에 적재를 다했으니 실행만 하면 됩니다.

 

 

메모리에 적재된 코드를 실행하는 방법은 몇가지 존재합니다.

 

1. 임의의 함수형 인자를 선언하여 해당 인자에 주소를 매핑하여 함수를 실행하듯이 실행하는 방법

2. Inline Assem 을 이용하여 실행하는 방법

3. 쓰레드 생성 후 해당 주소를 실행하게 하는 방법

4. 현재 동작중인 쓰레드의 Context를 변경하여 실행하게 하는 방법

5. 등등등....

 

제가 작성한 코드는 Inline Assem을 이용한 코드입니다.

 

 

굉장히 간단합니다.

 

pByte    = fileMapping (argv[1], &dwFileSize );

 __asm{
  call pByte;
 }

 

pByte에 쉘코드파일을 매핑한 메모리 주소를 받아 asm 명령으로 Call을 실행하면 됩니다.

 

 

분석 및 개발에 많은 경험을 쌓지 않았을때 사실 어떻게 인정 주소의 코드를 실행할 수 있을까라고 많은 고민을 한적이 있습니다. ( 한 2~3일 )

 

2번은 간단하게 답을 드렸습니다만 개인적으로 1번 방법을 한번 고민하시거나.. 또는 1,2,3,4번 방법이 아닌 다른 방법을 생각해시면 더 많은 도움이 되지 않을까 생각합니다.

 

감사합니다.

 

By runardor

 

 

'Study' 카테고리의 다른 글

Cmdlet(Power Shell)  (0) 2016.12.21
WMI (Windows Management Instrumentation)  (0) 2016.08.22
PowerShell을 이용한 다운로더  (0) 2016.08.22
PowerShell 에서 사용할 수 있는 환경 변수  (0) 2016.08.21
UAC( User Account Control )  (0) 2016.03.30
Comments