다른 컴파일러로 개발할 일 생기면 추가 예정


 

 Visual C

 

GCC 

 

 Bit

32 

64 

32 

64 

 INT 

 4

 LONG

 4

 FLOAT

 4

8

 DOUBLE

 4

8

8

8


멀티 소스로 개발시 LONG형이 문제가 될 수 있다. 특히 long 으로 리턴받는 api사용 시 주의.


8바이트를 쓰고자 한다면, int64_t / __int64_t 로 선언하면 어느 쪽에서도 확실하게 8바이트를 사용할 수 있다.

ScanBase64Function.dll


메모리에서 base64의 인코딩 및 디코딩 테이블을 검색한 후, 해당 테이블 주소를 text섹션에서 참조하는 코드 주소를 찾아냅니다.

char MimeBase64[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' };   char(혹은 int) DecodeMimeBase64[256] = { -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63, 52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1, -1, 0, 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,-1,-1,-1,-1,-1, -1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40, 41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 };  


사용 방법 : 플러그인 메뉴에서 Scan을 클릭하면, 검색 결과를 로그에 출력합니다.

속도가 매우 느립니다. (-_-)


실행 결과 예시: 

jscript.dll의 0x3F1E8630에서 base64 테이블을 검색하였습니다. encode용도일 가능성이 있습니다.

해당 주소를 6개의 코드에서 참조하고 있습니다.


개선해야할 내용

- 테이블을 사용하지 않는 BASE64 함수 검색

- encode / decode 용도 정확하게 구분하기

- 패커 (더미다 등) 적용시 확인해보지 못하였음




다운로드 페이지 : https://bonobogitserver.com/

테스트 환경 : Windows 2012 r2 Datacenter / bonobo 5.1.1


1.     관리에서 역할 및 기능 추가선택


2.     위 그림의 창이 뜰 때까지 다음을 클릭하고 웹 서버(IIS)”를 선택 후 다음클릭


3.     “ASP.NET 4.5”를 선택하고 다음클릭


4.     “ASP.NET 4.5”를 선택하고 다음 클릭


5.     필요한 경우 자동으로 대상 서버 다시 시작선택 후 설치클릭


6.     c:\inetpub\wwwroot에 압축을 해제한 후 c:\inetpub\wwwroot\Bonobo.Git.Server\App_Data 폴더를 마우스 우 클릭 후 속성” -> “보안” 탭을 클릭한 후 편집을 클릭



7.     “IIS_IUSRS” 선택 후 모든 권한허용을 선택한 후 확인을 클릭


8.     도구에서 “IIS(인터넷 정보 서비스) 관리자클릭


9.     좌측 트리 메뉴를 위 그림과 같이 펼친 후 “Bonobo.Git.Server”를 마우스 우 클릭한 후 응용 프로그램으로 변환클릭


10.     선택을 클릭


11.     “.NET v4.5”를 선택하고 확인


12.     브라우저에서 http://localhost/Bonobo.Git.Server 를 입력하여 접속이 되는지 확인한다.




APMSetup에서 SSL(https)을 구축하는 방법을 설명합니다.


1. APMSETUP 설치

기본 값으로 설치합니다.

http://www.apmsetup.com/download.php


2. Openssl 설치

아래 파일을 다운로드하여 c:\openssl에 압축 해제합니다.

openssl.zip

본 포스팅에서는 스스로가 인증기관(CA)이 되어 셀프 서명한 루트 공개키 인증서를 만들어서 사용합니다.


1) 개인키/공개키 만들기

인증기관(CA)의 키를 생성합니다.

>> openssl genrsa -out CA_Private.pem


2) 인증서 서명 요청서 만들기

인증기관에 요청할 요청서(CSR)를 만듭니다.

>> openssl req -new -key CA_Private.pem -out CA_Request.pem

지역, 회사명 등을 순서대로 기입합니다. 마지막 아래 2칸은 비워도 무방합니다.


3) 공개키 인증서 만들기

요청서를 가지고 인증기관의 개인키를 사용하여 공개키 인증서를 만듭니다.


3. APACHE 설정파일 수정

1) c:\APM_Setup\Server\Apache\conf\httpd.conf

아래 2줄을 찾아서 주석을 삭제합니다. 

#LoadModule ssl_module modules/mod_ssl.so 

#Include conf/extra/httpd-ssl.conf 


2) C:\APM_Setup\Server\Apache\conf\extra\httpd-ssl.conf 

- Webroot 경로명 수정
DocumentRoot "C:/APM_Setup/Server/Apache/htdocs" 을 "C:/APM_Setup/htdocs"으로 수정합니다.

키파일 경로명 수정
SSLCertificateFile "C:/APM_Setup/Server/Apache/conf/server.crt" 을 "C:/openssl/bin/CA_Cert.pem"으로 수정합니다.
SSLCertificateKeyFile "C:/APM_Setup/Server/Apache/conf/server.key" 을 "C:/openssl/bin/CA_Private.pem"으로 수정합니다.


4. 구동 및 확인


C:\APM_Setup\Server\Apache\bin\ApacheMonitor.exe을 실행하여 재시작한 뒤 빨간 밑줄과 같이 ssl이 올라왔는지 확인합니다.

접속 후 인증서를 확인해봅니다.


개발환경 : Visual Studio 2013 / Windows 7 x64

Active X, 후킹모듈과 같은 브라우저용 DLL을 개발하다보면 로그 처리 및 타 프로세스와 연동할 일이 생기는데 기본적으로 브라우저는 낮은 Integrity를 가지고 있으므로 temp폴더 정도의 자원만 사용할 수 있습니다.

제가 만든 프로그램 (PIPESERVER.exe - High Integrity)에서 생성한 파이프는 브라우저(iexplore.exe - Low Integrity)에서 사용할 수 없습니다.

이를 해결하기 위해 각종 핸들(PIPE 등)을 생성할 때 SECURITY 관련 속성을 인자로 주어야 합니다. 

아래 예제 소스는 RPC 파이프를 이용하여 브라우저 DLL에서 EXE의 함수를 호출하는 것을 보여줍니다.

(아래 참조사이트들을 참고하여 작성하였습니다.)

# EXE (서버) Side


# DLL (클라이언트) Side

주의하여야 할 점은 RpcStringBindingCompose 함수의 인자로 local을 의미하는 "\\\\."을 사용하였는데 일반적인 경우는 "localhost"를 사용해도 상관 없지만 브라우저 DLL의 경우 반드시 "\\\\."을 사용해야 정상 동작합니다.


도움이 되는 참조 사이트

RPC 기본 샘플 예제

http://www.codeproject.com/Articles/4837/Introduction-to-RPC-Part

VISTA에서 Active X와 통신

https://www.blackhat.com/presentations/bh-usa-08/Kim/BH_US_08_Kim_Vista_and_ActiveX_control_WhitePaper.pdf



함수가 호출 될 당시의 콜스택을 확인합니다.
DEPTH를 5로 설정하면 5 DEPTH까지 호출한 주소를 출력합니다.
만약 디버거 없이 동적으로 콜스택을 확인하고 싶다면 이 방법을 쓰면 됩니다.
(후킹용 DLL 에서 유용할 것이라 생각됩니다.)

이 예제는 TestFunction() 이 호출될 당시의 콜스택을 보여줍니다. (최적화 안함)


샘플을 돌린 결과입니다. 출력된 호출 주소의 바로 윗줄이 실제 호출 주소입니다.



빌드 환경 : Visual Studio 2010
필요 헤더 : windows.h
윈도우즈 환경에서 Crypto API를 이용하여 손쉽게 MD5를 구할 수 있습니다.



먼저 PowerShell이 무엇인지 잠깐 짚고 넘어가봅니다.

윈도 파워셸(Windows PowerShell)마이크로소프트가 개발한 확장 가능한 명령줄 인터페이스(CLI) 스크립트 언어이다. 객체 지향에 근거해 설계되고 있어 닷넷 프레임워크 2.0을 기반으로 하고 있다. 이전에는 마이크로소프트 셸(MSH, 코드네임 Monad)로 불리고 있었다.현재 윈도 XP, 윈도 서버 2003, 윈도 비스타, 윈도 서버 2008, 윈도 7, 윈도 8, 윈도 서버 2008 R2를 모두 지원한다.

위키백과에서 발췌한 내용입니다.

그냥 쉽게 말하면 리눅스의 bash 같은 쉘입니다.

파워쉘은 Windows에서 기본으로 제공하는데 여기에 쉘코드를 인젝션 시키는 것이 가능합니다.

이는 타겟 시스템의 기본 자원을 가지고 공격을 수행할 수 있다는 것을 의미합니다. 

실제 동작을 확인하기 위해 Metasploit으로 파워쉘용 쉘코드 스크립트를 작성해보겠습니다.

메시지박스를 실행시키는 페이로드를 불러온 뒤 파워쉘 스크립트로 저장합니다.

 

스크립트 파일이 생성되었습니다.

파워쉘을 실행시킨 뒤 생성된 내용을 그대로 붙여 넣기 합니다. 해당 코드는 x86이므로 wow64 파워쉘로 실행해야 합니다. (Windows x64의 경우)

(wow64 경로 : c:\windows\syswow64\windowspowershell\v1.0\powershell.exe)

 

아래는 결과입니다.

스크립트를 보면 알겠지만 쉘코드 스레드를 생성하여 실행시키는 간단한 내용입니다.

위의 스크립트를 페이로드로 활용하기엔 2% 부족합니다. 이를 Veil-Framework로 간단히 해결할 수 있습니다.

https://www.veil-framework.com/

Veil-Framework에서 제공하는 파워쉘 옵션과 다양한 페이로드를 결합하여 강력한 파워쉘 페이로드를 생성할 있습니다. 

첫 실행화면입니다. 39개의 페이로드가 로드되었다고 나옵니다. 이를 list 명령어로 확인할 수 있습니다.

이제부터 동일한 기능을 수행하는 페이로드를 생성할 것입니다.

파워쉘 쉘코드 인젝션을 이용할 것이므로 use 21을 입력합니다. 

 Generate를 입력합니다.

 디폴트 옵션을 사용합니다.

쉘코드를 선택하는데 tab 키를 누르면 리스트가 나타납니다. 그림과 같이 windows/messagebox 를 기입 후 적당한 값을 입력합니다.

 저장할 파일 이름을 입력합니다. 해당 파일은 bat확장자로 저장됩니다.

성공적으로 파일이 저장되었습니다.

해당 배치 파일을 실행하면 메시지박스 창이 나타납니다.

 

공격사례 : 작년에 발표된 "godmode" 익스플로잇입니다.

GradiusX, b33f 닉네임을 사용하는 해커들이 기존 발표된 익스플로잇에 파워쉘을 얹었습니다.

여기에 사용된 파워쉘은 위 실습 내용과 같으므로 패치되지 않은 IE 브라우저에서 실행해보시길 바랍니다.

http://www.exploit-db.com/exploits/35308/

프로세스 트리를 살펴보면 iexplore.exe -> powershell.exe 형태입니다.

이처럼 커맨드라인 RCE 공격 형태에서 매우 효과적인데, JRE 공격의 경우 대부분이 커맨드라인 형태이므로 유용할 것이라 생각됩니다.

 

본 포스팅은 LCF-AT가 TUTS4YOU에 공개한 Themida - Winlicense Ultra Unpacker 1.4 스크립트를 가지고 매뉴얼 언패킹 하는 것을 다룹니다. 

아래 URL에 더 자세하고 많은 내용이 있습니다.

https://tuts4you.com/download.php?view.3526 <-- 튜토리얼 동영상이 있습니다.

https://forum.tuts4you.com/topic/34085-themida-winlicense-ultra-unpacker-14/

준비물

OllyDbg 1.0 

ODbgScript / StrongOD / Phant0m 플러그인

ODbgScript.1.82.rarPhantOm Plugin v1.85.rarStrongOD v0.4.8.892.rar

언패킹 스크립트 / ARImpRec.dll 

ARImpRec.dllThemida - Winlicense Ultra Unpacker 1.0.txt

 

1. 디버깅 옵션에서 처음 정지될 포인트를 수정합니다.

2. 플러그인 옵션을 수정합니다.

   

3. 스크립트에서 DLL 경로를 수정합니다. 

4. 샘플을 로드 한 후 (F9로 실행 금지) 플러그인에서 스크립트 창을 띄운 후 실행합니다.

5. 중간에 call LOG_START가 나오면 Resume합니다.

6. EFL을 어디서 체크할 것인지 묻습니다. WinLicense 안에서 할건지 밖에서 할건지

여기선 472DF9에 있으므로 Yes(안) 를 누릅니다. (WinLicense : 470000 (size : 1F80000)

6. 다이렉트 API 점프를 FIX할 것인지 묻습니다. 처음엔 NO, 추후 실패하면 Yes를 누릅니다.

7. 언패킹에 성공하면 성공 메시지가 뜨면서 코드가 복원됩니다.


2016.02.02 수정 - 요즘도 포스팅에 대해 간혹 문의를 하시는 분들이 계신데 동작이 안되면 최신 언패킹 스크립트를 찾으시는 것이 문제 해결에 빠를 것입니다. 이것도 이제는 구자료이고 2014년 이후 버전에 동작이 안될 가능성이 높습니다. 구버전 언패킹 혹은 참고용으로 보시기 바랍니다.

본 포스팅을 따라하시면 손쉽게 VS2010에서 64비트 WDK를 개발하실 수 있습니다.

시스템 변수를 추가하는데 1,2,3 순서대로 클릭한 후 그림과 같이 새 시스템 변수를 입력합니다. (자신의 경로명에 맞게)

지금부터 프로젝트를 생성하여 빌드를 할건데 귀찮으신 분은 아래 프로젝트 파일로 테스트 해 보시길 바랍니다. 

sample 프로젝트 다운로드  

sample.zip

 

Visual Studio 2010을 실행하여 메이크파일 프로젝트를 생성합니다.

 

빌드 명령줄을 화면과 같이 입력합니다.

 

속성 페이지에서 포함 디렉토리에 그림과 같은 경로를 추가합니다. (자신의 경로에 맞게)

라이브러리 디렉토리도 추가해야 하는데 c:\WinDDK\7600.16385.1\lib\win7\i386 한 줄 추가합니다.

이제 빌드를 위해 필수 3가지 파일을 준비합니다.

ddkbuild.cmd

MAKEFILE

SOURCES

 

파일들을 자신의 프로젝트의 sample.vcxproj가 있는 디렉토리에 복사 후 SOURCES 파일을 열어 TARGETNAME과 SOURCES를 자신의 환경에 맞게 설정합니다.

빌드가 잘 되는지 테스트 합니다.

이제 asm을 추가할 차례입니다.

프로젝트 디렉토리에 AMD64 디렉토리를 생성합니다.

(필자의 경로 : D:\source\sample\sample\amd64)

SOURCES 파일에 아래 한 줄을 추가합니다.

AMD64_SOURCES=func.asm

프로젝트에서 func.asm을 생성 후 다음과 같이 입력합니다.

작성한 asm을 C에서 연동해봅니다.

빌드가 잘 되는지 테스트 합니다. 

 

이제 실제 머신에서 잘 동작하는지 테스트합니다.

드라이버 서명

원칙적으로는 64비트에서는 서명되지 않은 드라이버를 서비스에 등록할 수 없습니다.

하지만 OSR Loader + Driver Signature Enforcement Overrider (이하 DSEO) 툴 조합으로 이를 해결할 수 있습니다.

OSR Loader (AMD64 용) 다운로드OSRLOADER.exe

DSEO 다운로드dseo13b.exe

DSEO의 Sign a System File을 이용하여 sys를 서명합니다.

서명한 파일을 OSRLOADER로 실행하면 됩니다.

(만약 동작하지 않는다면 DSEO에서 Enable Test Mode로 설정하시기 바랍니다.)

+ Recent posts