Information


  • File Type : hwp
  • hash : f2e936ff1977d123809d167a2a51cdeb
  • hwp Property Set

  • Process Tree

  • Contents

Analysis


  • hwp 내부에는 EPS가 삽입되어 있음

  • EPS 내부함수의 xor 연산을 통해 쉘코드가 포함된 추가 루틴을 Decode함

  • Decode 된 전문 내부에서 쉘코드를 확인할 수 있음

  • 쉘코드를 분석하기 용이한 exe 형태로 변환

쉘코드 분석_1

  • NOP slide로 시작하는 엔트리포인트 확인할 수 있음(변환전과 동일)

  • XOR 연산을 통해 다음 실행될 루틴을 Decode함

  • CreateProcessA를 통해서 iexplorer.exe 프로세스를 생성함

  • 생성한 프로세스에 악성행위하는 내용 추가를 위해 아래의 API를 호출함

  • WriteProcessMemory 루틴 분석

  • 첫번째 인자인 HANDLE을 확인했을 때 84임을 확인할 수 있고, HANDLE 84의 값은 PID : 674

  • 0x674 = 1,652 이므로, PID 1652 값임을 알 수 있음

  • 두번째 인자인 값인 150000은 iexplorer.exe에 쓸 주소를 나타내고,

  • 세번째 인자의 4014D3 주소의 값을 Write함

  • CreateRemoteThread 루틴 분석

  • lpStartAddresslpParameter 인자로 0x150000(WrtieProcessMemory로 Write한 iexplorer.exe의 내부주소)로 설정되어 있음
  • 해당 API를 통해 프로세스가 suspend 상태에서 resume될 것임을 알 수 있음

첫번째 쉘코드는 iexplrer.exe 를 생성하고 추가 쉘코드를 Write 함으로써 악성행위를 수행

쉘코드 분석_2

  • LoadLibray API를 통해 wininet.dll 함수를 로드함

  • 이후 인자로 아래 URL을 인자로 주고 GetProcAddreass를 통해 wininet.dll dll의 InternetOpenUrlA API를 리턴함

두번째 쉘코드는 지정된 URL에 접속시도하고, 추가 파일을 다운로드하여 추가 악성행위 실행

  • 현재, C&C 서버는 닫혀있음


(혼자 공부하며 참고하기 위해 본문 내용을 그대로 가져왔습니다. 문제시 삭제 조치 하겠습니다.)


(프로세스 할로윙은 실행중인 신뢰하는 프로세스를 suspend 상태로 설정하고 dll 또는 코드 인젝션을 수행하는 것이다)



Process hollowing은 일부 악성코드에서 사용하는 기술이다. 악의적인 코드의 컨테이너로 동작하기 위해 시스템에 정상적인 프로세스를 로드시킨다. 실행되면, 정상적인 코드는 해제되고 악의적인 코드로 재정의 된다.

아름다운 이 기술은 기존 처리방식에서 악의적인 코드 실행을 숨길 수 있도록 도와준다. 이 기술에 대해 조금 더 살펴본다.

1 단계.

악성코드는 fdwCreate에 CREATE_SUSPENDED 플래그를 활성화 시켜 CreateProcess를 호출해 정상적인 프로세스를 실행한다.

2 단계.

프로세스가 생성되고 suspend 상태이다. 이제 호스트 프로세스 메모리로부터 정상 코드에 구멍을 만든다. 여기에선 ZwUnmapViewOfSection을 사용한다. 

3 단계.

악성코드는 VirtualAllocEx를 사용해 새로운 코드에 대한 메모리를 할당한다. 악성코드는 flProtect 플래그에 쓰기 가능하고 실행가능하도록 설정을 해야한다.

4 단계.

이제 WriteProcessMemory를 사용해 호스트 프로세스 구멍에 악성 코드를 쓴다.

5 단계.

악성코드를 위장하기 위해, 악성코드 제작자는 VirtualProtectEx를 사용해 다른 정상적인 프로세스들처럼 Read/Execute 보호 권한으로 재설정해야한다.
또한 새로운 코드 섹션을 가리키도록 리모트 컨텍스트 설정을 해줘야햔다. SetThreadContext API를 사용할 수 있다.

6 단계.

ResumeThread 함수로 suspended 스레드를 다시 resume 해주면 끝이난다.

탐지하는 것에 초점을 맞추면, 만약 기존 AntiVirus 처럼 정적 시그니처 방식을 사용하는 경우 어려울 것이다. 하지만 샌드박스 환경에서 시스템 콜 동적 분석을 하게 되면 가능하다. 


출처 : http://jmpcall.blogspot.com/2016/08/process-hollowing.html

추가 참고 자료 : http://sanseolab.tistory.com/57


'Reversing > Theory' 카테고리의 다른 글

Windows XP Folders and Locations & Windows 7 and Vista  (0) 2019.01.06
About Rich Header  (0) 2019.01.06
Code Injection overview  (0) 2019.01.06
프로세스 핸들과 PID의 차이  (0) 2019.01.06
CreateFile의 CreateFileW CreateFileA 차이  (0) 2019.01.06
우연히 '스타크래프트 시디키 알고리즘 분석' 이라는 게시물을 보게 되어 흥미롭게 보고 있던 중 'Back To user Mode'라는 기능이 있다는 사실에 조금 더 찾아보고자 하였다.


정의

Back To User Mode란 특정 이벤트를 일어나기 전에 설정해두고 Call 명령이 일어난 바로 다음 위치를 잡을 수 있다.

(참고문헌의 블로그에서 펌)


사용법
1. F12를 통해 디버깅 중인 올리를 pause 상태로 만든다.
2. Alt + F9를 통해 BTUM 모드로 설정
3. 프로그램에서 이벤트가 발생
4. 올리가 해당 부분 커서로 이동

이라고는 하는데 무슨말인지는 직접 해보지 않고는 정확하게 파악하기 힘든것 같다.
특정 값을 입력받는 시리얼 입력창, 키값을 입력받는 부분에서 해당 부분의 함수 호출부를 찾아가는것을 유용하게 해주는 기능으로 예상한다.

악성코드 분석에 어떻게 활용할 것인가?
1. 특정 값을 검증하는 부분의 함수 호출부를 편리하게 찾아갈 수 있을것이다.
(Search for -> Name in all modules를 통해서 예상가능한 API명을 입력해서 찾을 수 도 있을것 같다.)
2. 악성코드 분석에서 크게 활용할 부분은 없을것 같다.



참고문헌

스타크래프트 시디키 알고리즘 분석 [1], http://carpedm20.blogspot.com/2012/08/blog-post_7630.html
Back To User Mode, http://kblab.tistory.com/57


'Analysis > Theory' 카테고리의 다른 글

Themida 단순 Unpack  (0) 2019.01.06
악성코드 'PlugX Dropper'의 설치 방식  (0) 2019.01.06
중복 실행 방지 코드_CreateMutex( )  (0) 2019.01.06
프로세스와 스레드(Process & Thread)  (0) 2019.01.06

(혼자 공부하며 참고하기 위해 본문 내용을 그대로 가져왔습니다. 문제시 삭제 조치 하겠습니다.)


IDA pro 에서 "C" 단축키가 해주는 일~

Sality.L이 3주동안 내 머리를 미치게 만들고 있다...
슬슬 본체와 바닥이 드러나려고 하고있다.. 머지 않아 좋은 결과물이 나오지 않을까 하는 기대심이 한가득이다.

IDA는 디어셈블 툴중에서도 단연 으뜸으로 인정받고 있는 도구이다.
강력한 기능들과 더불어 Hexrays plugin은 IDA를 더욱더 빛나게 해주는 디컴파일 플러그인이다.
만든사람이 천재로 불린다는..ㅋ
이런 강력한 IDA에 대해서 작은 기능( __)ㆀ 하나 소개하려 한다.

악성코드들중에 정상 파일을 감염시켜 숙주를 잡고 그 숙주에 기생을 하는 형태를 "파일 바이러스" 라고 지칭한다. 이 파일 바이러스들은 정상적인 PE의 개념(?)과는 조금 다른점이 있다.

 - 정상적인 PE들은 보통 각 섹션의 특성에 맞게 코드들이 위치해 있다. 즉, 므슨 말인고 하니..
   .text 섹션 에는 실지로 실행되는 코드들이..
   .data 섹션 에는 코드실행에 있어 쓰이는 각종 데이터들이 위치해 있게 된다.
   물론 여타 다른 섹션들도 그들만의 특성들과 특징들로 데이터들을 담고 있다.

자.. 하지만 파일 바이러스는 그렇지 않다.
자신의 코드로 실행의 흐름을 변경하기 위해, 원래의 정상 코드를 좀 수정을 하게 된다.
수정된 코드는 감염된 시스템이 순차적으로 opcode들을 한줄 한줄 실행하면서 결국엔 바이러스가 하고자 하는 본래의 목적을 위한 코드로 실행의 흐름을 바꾸게 된다.

물론 이 바이러스의 코드들은 여러가지 방법으로 기생하게 된다. 섹션을 한개 더 생성하거나 또는 원래의 섹션을 늘려서 그곳에 코드를 넣거나.. 하는 방법들로 말이다.

이렇게 기생하게 되는 바이러스 코드안에는 수정된 원래의 코드들도 포함되어 있다.
왜?! 제대로 만든 또는 제대로 감염된 파일 바이러스는 자신의 코드를 실행하고도, 숙주파일의 정상 실행을 위해 수정한 코드를 원복시키기 때문이다. 물론 이는 숙주가 실행되어 메모리에서 일어나는 일련의 과정을 말하는 것이다.
코드를 원복시키는 이유는 사용자가 감염의 여부를 쉽게 알아차리지 못하게 하기 위함이다.

서두가 길었다.... 이렇게 바이러스 코드는 기존의 text코드 섹션이 아닌 자신의 코드는 엉뚱한 데이터 섹션의 형태로 기생하게 된다.
물론 ollydbg에서는 코드 섹션이 아닌 다른 부분들도 analysis를 대부분 해준다.
하지만 ida는 code섹션만을 디어셈블 해준다.
데이터로 분석된 코드들을 opcode 로 analysis하고자 한다면 분석을 위한 루틴의 시작 offset으로 이동해서
과감히 "C"를 눌러보자. 다음과 같이 IDA가 분석을 해준다. 물론 2번째 그림의 주석은 안달아 준다.. -0-




[ analysis 되기전의 데이터 형태의 코드 ]

[ analysis 된 코드 ]


출처 : http://mylabs.tistory.com/2

'Reversing > IDA' 카테고리의 다른 글

[Solution] Decompilation failure from IDA Decompiler  (0) 2019.01.06

(혼자 공부하며 참고하기 위해 본문 내용을 그대로 가져왔습니다. 문제시 삭제 조치 하겠습니다.)


IDA 디컴파일러(F5)로 디컴파일 하다보면 가끔 스택 문제도 실패하는 경우가 있습니다.


'Decompilation failure: xxxxxx: positive sp value has been found"




오류가 발생한 주소 앞 (여기서는 0x401018)으로 가서 [Alt + K] 로 Chage SP value 를 실행합니다.





이 값을 Current SP value 와 맞춰주면 됩니다.




다시 F5로 디컴파일 해보면 디컴파일된 내용이 나옵니다.





출처 : http://www.devblog.kr/r/8y0gFPAvJ2u8XI5QweIKkJ3zHCYK0j87F3yvJe4SbzF8

'Reversing > IDA' 카테고리의 다른 글

data code 분석을 위한 ida의 사용법 & Sality.L  (0) 2019.01.06

(혼자 공부하며 참고하기 위해 본문 내용을 그대로 가져왔습니다. 문제시 삭제 조치 하겠습니다.)


악성코드 분석을 하다보면 여러가지 팩커를 만나는데 너무 힘들게 하는 패커는 더미다 이다.

분석을 편하게 완벽하게 만들수는 없지만 간단한 방법으로 언팩하는 방법을 기술 한다.


# 이방법은 단순히 메인 함수를 찾는 방법이다 . 더미다의 분석 방해 기법인 API리다이렉트 등에 대한 해결책은 제시 되어 있지 않다.


1. 더미다 안티 디버깅 우회

종종 이런것들이 힘들게 한다 PhamtOm플러그인으로 우회를 할껀데 귀찬으니까 옵션을 다켠다.




2. ZwFreeVirtualMemory 에 BP

ZwFreeVirtualMemory 에 BP를 건다.





3. 코드섹션 값 확인


Shift + F9 를 눌러가면서 코드섹션 값을 확인한다.





코드섹션 값이 코드로 변하면 ZwFreeVirtualMemory 에 BP 없엔다.




4. 메인 함수 찾기


코드섹션에서 B8 4D5A0000 바이너리를 찾고 BP를 걸고 Shift + F9 를 누른다.





이후 F8을 누르면서 진행하다 보면 메인 함수로 들어가는 곳을 발견할수 있다.




출처 : http://dandilab.tistory.com/30

(혼자 공부하며 참고하기 위해 본문 내용을 그대로 가져왔습니다. 문제시 삭제 조치 하겠습니다.)



 악성코드나 특정 프로그램에서는 중복(다중) 실행을 방지하기 위해 뮤텍스를 사용합니다.


TEST 프로그램이 있습니다. 이 프로그램은 실행했을 때 CreateMutex( ) API를 호출해서 뮤텍스를 생성하고 정상 종료되었을 때 ReleaseMutex( ) API를 호출해서 핸들을 반환합니다. 그리고 중복 실행 방지 코드가 포함되어 있다고 보겠습니다.

여기서 TEST 프로그램이 정상적으로 종료된다면 추후 동작에 아무런 문제가 없습니다. 그러나 또 다른 TEST 프로그램을 다중으로 실행시키거나 동작하고 있는 TEST 프로그램을 강제로 종료시키고 난 뒤에 다시 실행시키려고 할 경우, 동작하지 않습니다.

그 원리는 다음과 같습니다. 뮤텍스는 커널 오브젝트이기 때문에 모든 프로세스를 통 틀어서 하나만 존재합니다. 동일한 뮤텍스가 이미 있는 상태에서 CreateMutex( ) 또는 OpenMutex( )를 호출하면 에러가 발생하고 GetLastError( )를 사용하면 ERROR_ACCESS_DENIED나 ERROR_ALREADY_EXISTS 값이 나옵니다. 이 값을 확인해서 프로그램 실행 여부를 결정하는 것이 Mutex를 이용한 중복 실행 방지 코드입니다. 다음은 간단하게 작성된 중복 실행 방지 코드 입니다.




출처 : http://securityfactory.tistory.com/296

'Analysis > Theory' 카테고리의 다른 글

Ollydbg_Back To User Mode  (0) 2019.01.06
Themida 단순 Unpack  (0) 2019.01.06
악성코드 'PlugX Dropper'의 설치 방식  (0) 2019.01.06
프로세스와 스레드(Process & Thread)  (0) 2019.01.06

(혼자 공부하며 참고하기 위해 본문 내용을 그대로 가져왔습니다. 문제시 삭제 조치 하겠습니다.)



운영 체제는 프로그램을 실행할 때 프로세스 단위로 관리합니다. 동작 중인 프로그램이 하나의 프로세스가 되는 것입니다. 운영 체제에서는 프로세스를 사용하여 실행 중인 다양한 응용 프로그램을 구분하고 스레드는 운영 체제에서 프로세서 시간을 할당하는 기본 단위가 됩니다.



※ 프로세스 구성 요소(메모리 구조)

 - Data 영역: 전역변수나 static 변수의 할당을 위해 존재하는 영역입니다.

 - Stack 영역: 지역변수 할당과 함수 호출 시 전달되는 인자 값들의 저장을 위해 존재합니다.

 - Heap 영역: 동적할당(malloc, calloc 함수에 의한 할당)을 위해 존재합니다. (프로그래머가 할당.)

 - Code 영역: 실행파일을 구성하는 명령어들이 올라가는 메모리 영역입니다.




스레드는 프로세스 내에서 실행되는 흐름의 단위를 말합니다. 일반적으로 하나의 프로세스는 하나의 스레드를 가지고 있지만 프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있습니다. 이러한 실행 방식을 멀티 스레드라고 합니다. 스레드가 여러개 실행될 경우 스케줄러는 각 스레드에게 시간을 할당하여 실행함으로써 사용자가 보기에 여러 스레드가 동시에 실행되는 것 처럼 보이게 됩니다.



※ 스레드 특징

 - 각 스레드는 독립적인 스택 영역을 가집니다.

 - 코드 영역을 공유합니다.

 - 데이터 영역 및 힙 영역을 공유합니다.(전역변수와 동적 할당된 메모리 공간도 공유가 가능합니다.)

 - 프로세스 핸들 테이블을 공유합니다. 프로세스 핸들 테이블에 대한 핸들 정보는 프로세스 내의 스레드들에게  

   공유되어 각 스레드가 그 핸들에 대해 접근이 가능합니다.

 - 결국 같은 프로세스 내의 스레드들은 스택 이외의 모든 것을 공유하게 됩니다.




출처 : http://securityfactory.tistory.com/59

'Analysis > Theory' 카테고리의 다른 글

Ollydbg_Back To User Mode  (0) 2019.01.06
Themida 단순 Unpack  (0) 2019.01.06
악성코드 'PlugX Dropper'의 설치 방식  (0) 2019.01.06
중복 실행 방지 코드_CreateMutex( )  (0) 2019.01.06

1. Overview



1.1 Origin of name


VirusTotal Software Engineer인 Victor M. Alvarez의 트윗에 따르면 YARA의 Full name은 다음과 같다.


"YARA is an ancronym for:

YARA: Another Recursive Ancronym, or Yet Another Ridiculous Acronym. Pick your choice."


Yet Another Recursive Acronym 또는 Yet Another Ridiculous Acronym 이다[1][2].



2. About YARA



2.1 Features of yara


yara의 특징은 다음과 같다[3].


º 텍스트 기반 또는 바이너리 패턴을 기반으로 Malware 변종(malware families)에 대한 탐지를 제공

º 16진수 문자열, 텍스트 문자열, 정규 표현식 (Regular Expression) 을 지원

º PE, ELF 분석을 처리하는 모듈과 함께 오픈 소스 Cuckoo 샌드박스를 지원



Rules을 작성하는 기준에 대한 가이드는 다음과 같다[4].


º Rules에 Hit 되는 기준은 악성코드의 동작에 필요한 부분이여아 함

º 작성한 Rules는 기준 악성코드와 변종 악성코드 패밀리를 구별할 수 있을정도로 충분해야함

º 작성한 Rules는 다른 악성코드들 사이에서 일반적으로 통해야 한다(common across).




2.2 Get rules from external sources


YaraRules Github에서는 다양한 Rule set을 제공한다. rules는 Anti-Debug 및 Anti-Visualization techniques, 악성 문서, 패커 등을 탐지하기위한 규칙이 있다[5].

또한 VirusTotal, ThreatConnect 등과 같은 위협 정보 공유 플랫폼(Threat Intelligence sharing platforms)들이 YARA를 지원한다. 이를 통해 수집한 위협 정보를 기반으로 Rules를 작성할 수 있다[6][7].


VirusTotal의 경우 개인 API로 자신의 Rules를 입력하고 Hit 되는 샘플이 업로드 될 때 notice 해준다.

[그림 1]은 위협 정보 공유 플랫폼에서 지원하는 YARA 화면이다.


[그림 1] VirusTotal and ThreatConnect



2.3 Automatically generate rules

yara rules를 작성하는 일을 자동화 해주는 경우는 다음과 같다.


º Joe Sandbox[8]
- https://www.joesandbox.com/yaraspaged/
- Joe Sandbox에서는 동적 분석 결과를 바탕으로 Windows용 Signature를 제작할 수 있음
- 무료 온라인 샌드박스 (VirusTotal, Hybrid-Analysis, Malwr 등)과 호환

º Hyara[9]
- https://github.com/hy00un/Hyara
- 정적 분석 단계에서의 YARA 제작의 편의성을 극대화한 강력한 IDA Plug-in

(Hyara 관련 내용은 본 블로그의 Make yara rule with Hyara (IDA plug-in) 게시글 참고)






2.4 Make yara rules

자세한 문법은 YARA documentation 를 참조


2.4.1 Strings 문법

º wide : Unicode와 같은 2바이트 문자를 한 글자로 검색할 때 사용
º ascii : ascii 문자열 형식 검색 (wide와 함께 사용할 경우  순서 상관없음)
º nocase : 대/소문자 구분하지 않음
º fullword : 문자열을 하나의 문자열로 취급 (?)

<코드 분석 이후 yara 제작과 함께 상세한 내용 작성 예정>
<yara import 추가>
<yara 문법 추가>


N. Conclusions



암호화, 패킹, 다형성 등 우회가 비교적 쉬운 시그니처 기반 탐지에 대한 문제점들이 제시되고 있지만 여전히 YARA는 강력한 시그니처 기반 탐지 도구이다. 탐지 방안에 있어서 단독으로 사용하기는 무리가 있지만 다양한 탐지 도구들과 함께 병행하면 문제가 없다고 생각하며, 자동화 도구를 활용하여 높은 능률을 보장 받을 수 있다고 생각한다.

N. Related Reports



(1) https://github.com/VirusTotal/yara

(2) https://yara.readthedocs.io/en/v3.8.1/

(3) https://yararules.com/

(4) https://github.com/Yara-Rules/rules

(5) https://twitter.com/yararules



N. References



[1] https://twitter.com/plusvic/status/778983467627479040

[2] https://github.com/VirusTotal/yara/issues/58

[3] https://yara.readthedocs.io/en/v3.5.0/index.html

[4] https://securityintelligence.com/signature-based-detection-with-yara/

[5] https://github.com/Yara-Rules/rules

[6] https://www.virustotal.com/

[7] https://threatconnect.com/

[8] https://www.joesecurity.org/blog/8938263704094453988

[9] https://github.com/hy00un/Hyara

블로그 이전으로 작성시간 변경됨 - 기존 [2018.08.01 01:09] 작성


악성코드 분석에 있어서 코드인젝션 기법은 반드시 알고 있어야 하는 개념이다. 본 포스팅에서는 코드인젝션에 대한 개념을 정리한다.


1. 코드인젝션이란?


- 코드인젝션은 (정상적인) 프로세스에 악성코드를 주입하는 기술

- 악성코드가 별도의 프로세스를 생성하지 않고 (정상적인) 프로세스의 메모리 영역에 숨어서 동작

- 프로세스 목록만을 조사해서는 탐지할 수 없음

- 프로세스 이름을 기반으로 한 필터링(방화벽 등) 우회 가능

- 주입된 코드는 Target Process의 메모리 영역에 마음대로 접근할 수 있음




1.1 코드 인젝션의 종류


1. Remote Code Injection

2. Process Hollowing

3. Dll Injection

4. Reflective DLL Injection 등






2. Remote Code Injection



1) AdjustTokenPrivilege() -> SeDebugPrivilege 권한 획득
2) Process walking : Target Process(Host Process) 탐색
3) Target Process의 핸들 획득
4) VirtualAllocEx() -> Target Process의 가상 주소 공간에 새로운 메모리 영역 할당
5) VirtualProtectEx() -> Target Process 내에 새롭게 할당받은 메모리 프로텍트 속성에 read/write/execute 권한 추가
6) 주입할 코드 로드 : 주입 경로(네트워크(Memory only malware), 파일, 레지스트리 등)
7) WriteProcessMemory() -> 읽어들인 코드를 Target Process 내에 새롭게 할당받은 메모리 영역에 주입
8) CreateRemoteThread() -> 쓰레드 생성 후 EPROCESS 구조체에 있는 쓰레드리스트에 새로운 쓰레드를 등록하여 주입된 코드를 실행하도록 함






2.1 Remote Code Injection에 쓰이는 주요 API


1) AdjustTokenPrivilege()
    타겟 프로세스의 메모리에 코드를 주입하기 위해 SeDebugPrivilege 권한 활성화
2) OpenProcess()
    타겟 프로세스의 핸들 획득
3) VirtualAllocEx()
    SeDebugPrivilege 권한이 있으면 다른 프로세스의 빈 영역에 코드 주입 가능
    타겟 프로세스의 가상 주소 공간에 새로운 메모리 영역 할당
4) VirtualProtectEx()
    타겟 프로세스 내에 새롭게 할당받은 메모리의 프로텍트 속성에 read/write/execute 추가
    메모리 프로텍트 속성은 VAD 영역에 저장됨






3. Process Hollowing



1) AdjustTokenPrivilege() -> Target Process에 메모리를 주입하기 위해 SeDebugPrivilege 권한 활성화
2) CreateProcess(..CREATE_SUSPENDED..) -> Target Process를 suspended 모드로 만듬
    cf) suspended 모드 : EPROCESS 구조체 등 정상 생성되나 동작은 하지 않음
3) ZwUnmapViewOfSection() or NtUnmapViewOfSection() -> Target Process의 메모리 영역을 비움(Hollowing out)
4) VirtualAllocEx() -> Target Process의 가상 주소에 새로운 메모리 영역 할당

5) 주입할 코드 로드 : 네트워크, 파일, 레지스트리 등
6) WriteProcessMemory() -> 읽어들인 코드를 Target Process 내에 새롭게 할당받은 메모리 영역에 주입
7) GetThreadContext() && SetThreadContext() -> 다음에 실행할 명령어의 주소가 주입한 코드의 시작점이 되도록 Thread context 변경
8) ResumeThread() -> suspended 상태의 Target Thread 실행





4. Dll Injection



- Target Process에 악성 DLL을 강제로 삽입하는 기법
- 로딩된 DLL 파일은 Target Process의 메모리 공간에 접근할 수 있음
- 프로그램 기능개선, 버그 패치, 악성 목적 으로 이용 가능
- 종류 : 레지스트리 조작, SetWindowsHookEx() 이용, CreateRemoteThread() 이용 등


- 키로거 제작에 많이 이용되는API(SetWindowsHookEx())를 이용
- 이벤트(키보드 입력) 발생 시 OS와 어플리케이션이 주고받는 함수인 SetWindowsHookEx()를 이용하는 경우도 있음




5. Remote Dll Injection



1) AdjustTokenPrivilege() -> Target Process의 메모리를 할당하고 데이터를 쓰기 위해 SeDebugPrivilege 권한 활성화
2) Process walking (타겟 프로세스를 찾는 과정)
3) OpenProcess() -> Target Process의 핸들 획득
4) VirtualAllocEx() -> Target Process의 가상 주소 공간에 새로운 메모리 영역 할당
5) WriteProcessMemory() -> Target Process의 새롭게 생성된 가상 주소 공간에 로딩할 DLL 파일의 경로 기록
6) CreateRemoteThread() -> Target Process에 쓰레드 생성 쓰레드가 실행할 코드의 주소는 LoadLibrary()의 주소, LoadLibrary()에 전달할 파라미터는 VirtualAllocEx()로 할당한 주소값으로 설정

(LoadLibrary 주소는 GetModuleHandle의 인자로 "Kernel32.dll"를 주어 핸들을 구하고 GetProcAddress의 인자로 "LoadLibrary"를 줘서 주소를 구할 수 있다.

hMod = GetModuleHandle("kernel32.dll");
pThreadProc = (LPTHREAD_START_ROUTINE)GetProcAddress(hMod, "LoadLibraryA"); 


Remote Dll Injection은 VAD 영역을 조사한다고 해서 탐지할 수 없다. 정상적으로 LoadLibrary() API를 이용하기 때문에 정상적으로 파일이 매핑되어 있어서 VAD 영역에서 탐지해낼 수 없다.




6. Reflective DLL Injection



- Remote DLL Injection이 로드할 dll 파일 이름을 기재하고 LoadLibrary()을 호출하여 이루어지는 데 반하여
- Reflective Dll Injection은 WriteProcessMemory()을 이용하여 DLL 파일 자체를 주입함

- VAD 영역에서 프로텍트 속성이 READEXECUTE 권한이 있고 매핑된 파일이 없는 경우 인젝션(Remote Code 인젝션, Process Hollowing, Reflective DLL 인젝션)을 의심해야함





7. References


1. LoadLibrary() 주소 구하는 방법 - http://reversecore.com/40

2. GetModuleHandle과 LoadLibrary - http://egloos.zum.com/itbaby/v/4659384




'Reversing > Theory' 카테고리의 다른 글

Windows XP Folders and Locations & Windows 7 and Vista  (0) 2019.01.06
Process Hollowing  (0) 2019.01.06
About Rich Header  (0) 2019.01.06
프로세스 핸들과 PID의 차이  (0) 2019.01.06
CreateFile의 CreateFileW CreateFileA 차이  (0) 2019.01.06

+ Recent posts