우연히 '스타크래프트 시디키 알고리즘 분석' 이라는 게시물을 보게 되어 흥미롭게 보고 있던 중 '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

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


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

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


# 이방법은 단순히 메인 함수를 찾는 방법이다 . 더미다의 분석 방해 기법인 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

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


#PlugX Malware


보통의 경우 최초 드럽퍼가 실행되면 exe, dll, data 파일(확장자는 제작자 마음) 이렇게 3종류의 파일이 특정 폴더에 설치가 된다. 최초 드럽퍼가 어떻게 실행되는 지 확인하지 못 했지만, 방법이야 다양하니 생략,,


예)

C:\Program Files\Common Files\Nv.exe

C:\Program Files\Common Files\NvSmartMax.dll

C:\Program Files\Common Files\NvSmart.mp3


같은 폴더에 나란히 3가지 파일이 설치되면 먼저 exe파일이 실행되고 DLL이 로드되며 해당 DLL이 다시 남은 data 파일(위의 NvSmart.mp3)을 로드하는 방식이다. 설치를 위해 각각의 파일이 반드시 존재해야하는 것이다.


그런데 3가지 파일이 반드시 필요한 이유가 더 있다. 자세히 살펴보면...


일단 DLL 파일의 Main코드를 살펴보면 다음과 같은 코드들을 볼 수 있다.






처음부터 '20120101'을 현재 실행되고 있는 PC의 System시간과 비교한다. 이 부분은 상기 언급한 반드시 필요한 부분에 포함되지 않지만, 굳이 비교하는 이유가 궁금해서.. 이유가 뭘까.





위 그림을 보면 Module EP를 찾아서 EP의 Page를 R/W하게 변경한다. 그리고 다음과 같이 하드 코딩된 주소(_DataLoad_Routine_)와 EP의 거리를 계산해서 Module EP부분에 덮어쓴다. 해당 어셈코드는 "E8 A6 18 00 00"에서 "E8 8A F8 8F 0F"로 변경되면서 점프되는 곳이 _DataLoad_Routine_ 주소로 바뀌는 것이다.



[DLL Main 코드에 삽입된 EP 수정코드]


어쨌건 정리하면, exe는 쓰고자하는 DLL을 import하고..




DLL이 로드되면 DLL Main코드가 실행되면서 exe의 EP가 수정되며(exe 시작전) 다시 DLL의 특정 주소로 점프가 된다(exe 시작 직후). exe는 dll 실행히켜주고 dll은 exe 수정해주고 다시 exe는 dll을 통해 data 파일을 호출하는...완벽한 호흡을 자랑한다..;;


그리고 첨부해서.. exe 원래 EP 코드를 보면 CRTStartup 보다 먼저 어떤 Call이 실행 되는 것을 볼 수 있다. 그래서 exe를 그냥 메인코드 먼저 디버깅하거나 IDA같은 Disassembler로만 보면 놓치는게 있을 수도..



출처 : 출처 : http://arisri.tistory.com/entry/%EC%95%85%EC%84%B1%EC%BD%94%EB%93%9C-PlugX-Dropper%EC%9D%98-%EC%84%A4%EC%B9%98-%EB%B0%A9%EC%8B%9D

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

Ollydbg_Back To User Mode  (0) 2019.01.06
Themida 단순 Unpack  (0) 2019.01.06
중복 실행 방지 코드_CreateMutex( )  (0) 2019.01.06
프로세스와 스레드(Process & Thread)  (0) 2019.01.06

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



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


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

+ Recent posts