posted by 블르샤이닝 2011. 10. 28. 18:16
728x90
오래만에 글쓰는군요.... 트위터에서 돌고있는 문서였는데 받아보니 괜찮은 내용이군요. 


여기잇는 툴도 최신버젼으로 소개하고 상세 분석도 보여주고....다만 원서네~_~ㅋㅋ라랄랄




728x90

'리버싱' 카테고리의 다른 글

From ROP to JOP  (0) 2011.12.15
How to bypass antivirus with Metasploit  (0) 2011.12.15
PEB 구조체를 이용한 간단한 안티디버깅 코드  (0) 2011.10.07
unpack_dragonarmour  (0) 2011.09.06
Simple IDA Pro plugin to look up APIs on MSDN  (0) 2011.08.17
posted by 블르샤이닝 2011. 10. 7. 11:50
728x90

PEB 구조체를 이용한 간단한 안티디버깅 코드

CALL      00000000
MOV       EAX, 18
MOV       EBX, DWORD PTR FS:[EAX]
ADD        EBX, 30
MOV       EAX, EBX
MOV       EAX, DWORD PTR DS:[EAX]
INC         EAX
INC         EAX
MOVZX   EAX, BYTE PTR DS:[EAX]
SHL        EAX, 2
ADD        EAX, 63
ADD        DWORD PTR SS:[ESP], EAX
RETN


이걸 좀 눈에 보기 좋게 바꾸면....

CALL      00000000
MOV       EAX, DWORD PTR FS:[18]
ADD        EAX, 30
MOV       EAX, DWORD PTR DS:[EAX]
ADD        EAX, 2
MOVZX   EAX, BYTE PTR DS:[EAX]
SHL        EAX, 2
ADD        EAX, 63
ADD        DWORD PTR SS:[ESP], EAX
RETN


FS:[0] 레지스터는 TEB구조체의 시작이다.
TEB구조는 다음과 같다.

typedef struct _TEB
{
    NT_TIB NtTib;
    PVOID EnvironmentPointer;
    CLIENT_ID ClientId;
    PVOID ActiveRpcHandle;
    PVOID ThreadLocalStoragePointer;
    PPEB ProcessEnvironmentBlock;
    ULONG LastErrorValue;
    ...
}

FS:[18] 이라고 하면.. NT_TIB의 멤버중 하나이다.
NT_TIB의 구조체는 다음과 같다

typedef struct _NT_TIB
{
     PEXCEPTION_REGISTRATION_RECORD ExceptionList;
     PVOID StackBase;
     PVOID StackLimit;
     PVOID SubSystemTib;
     union
     {
          PVOID FiberData;
          ULONG Version;
     };
     PVOID ArbitraryUserPointer;
     PNT_TIB Self;
} NT_TIB, *PNT_TIB;

그러므로 FS:[18]은 PNT_TIB Self; 값을 가리키고 있으며... 이것은 즉 FS:[0]을 뜻하는 것과 마찬가지다...
그러므로 아까 안티디버깅 코드를 좀 더 줄이면... 다음과 같이 줄일수 있다.

CALL      00000000
MOV       EAX, DWORD PTR FS:[30]
ADD        EAX, 2
MOVZX   EAX, BYTE PTR DS:[EAX]
SHL        EAX, 2
ADD        EAX, 63
ADD        DWORD PTR SS:[ESP], EAX
RETN

FS:[30]은 PEB 구조체에 대한 포인터를 가지고 있으며... PEB 구조체는 다음과 같다.

typedef struct _PEB {
    BOOLEAN InheritedAddressSpace;
    BOOLEAN ReadImageFileExecOptions;
    BOOLEAN BeingDebugged;
    BOOLEAN Spare;
    HANDLE Mutant;
    PVOID ImageBaseAddress;
    PPEB_LDR_DATA LoaderData;
    PRTL_USER_PROCESS_PARAMETERS ProcessParameters;
    ...
}

그러므로 위의 안티디버깅코드는... PEB 구조체의 BeingDebugged 값을 체크하여 만약 디버깅중일때는 0이 아닌 값이 저장되어 있으므로 이 값을 이용하여 리턴되는 EIP값을 조작하여 임의의 주소로 분기시켜 비정상 실행을 시키고 있다.
이 값은 IsDebugerPresent() 함수에서도 사용을 하여 디버깅 체크를 하고 있다.


참고사이트 :
http://www.nirsoft.net/kernel_struct/vista/NT_TIB.html
http://vbdream.tistory.com/entry/Windows-TEBThread-Environment-Block-%EC%82%B4%ED%8E%B4%EB%B3%B4%EA%B8%B0
728x90
posted by 블르샤이닝 2011. 9. 6. 14:48
728x90

이번에 drgonamour 패킹관련 동강이라고 합니다... 

 

강00씨가 주신거 ㅋㅋ 잘 쓰겠습니다

 

 

728x90
posted by 블르샤이닝 2011. 8. 17. 15:30
728x90

If you are anything like me, you don’t carry all information about all Windows APIs and structures in your head. So, you’ll have to look it up, typically on MSDN. I made a plugin that makes that process a little less cumbersome – just place the cursor inside the API name in the IDA Disassembly View and press CTRL-B to open MSDN Bing hits in your browser.

The source is attached as well.

The plugin is available for download here.

Archive hash:
SHA256: b2da1f280f2332d814824a2ccddefcc215027c70e7de6a108f1169a72e5ce047

728x90
posted by 블르샤이닝 2011. 8. 8. 14:59
728x90

프로그램의 중복 실행을 막는 방법은 여러가지가 있습니다.
그 중 3가지를 소개하고 제가 사용하는 방법을 알려드리려 합니다.

1. FindWindow() API를 이용하는 방법
    - 이 API는 RegisterClass() 또는 RegisterClassEx() API를 이용하여 등록된 클래스명이나 프로그램명(Title)을 이용하여 특정 윈도우를 찾는 함수입니다.
    - 가장 간단한 코드로 구현할 수 있습니다. 그러나 문제점을 갖고 있어 사용을 권장하진 않습니다.
    - 문제점1: 클래스명이나 프로그램명은 중복될 확률이 높아 우리가 원하는 프로그램을 찾아내지 못합니다. (예를들면 탐색기의 프로그램명은 폴더명에 따라 바뀌기 때문에 혼동되기 쉽습니다.)
    - 문제점2: 프로그램을 아주 빠른 속도로 두번 연속 실행시킬 경우 정상적으로 동작을 안할 수 있습니다.
    - 문제점3: 레이스 컨디션(Race Condition: 두 개의 쓰레드가 실행될 때 어떤 스레드가 먼저 처리되느냐에 따라 결과가 달라지는 것)이 존재합니다.

// MyApp.cpp : Defines the class behaviors for the application.
#include "stdafx.h"
...

BOOL CMyApp::InitInstance()
{
    HWND  hwndClone;

    hwndClone = ::FindWindow(NULL, _T("프로그램 이름 (My App. Title)"));
    if (hwndClone != NULL)
    {
        ::SetForegroundWindow(hwndClone);
        if (::IsIconic(hwndClone))
            ::ShowWindow(hwndClone, SW_SHOWDEFAULT);
        return FALSE;
    }



    ...
}



2. 뮤텍스(Mutex)를 이용하는 방법
    - 커널 객체인 뮤텍스는 단 하나의 쓰레드만이 소유할 수 있다는 성질을 이용합니다. (뮤텍스에 대한 자세한 설명은 'Windows API 정복, 가남사' 또는 'TCP/IP 소켓 프로그래밍, 프리렉'을 참조하세요.)
    - 뮤텍스를 생성하기 위해서는 CreateMutext() API를 이용합니다. 이 API의 세번째 인자에 뮤텍스 이름을 넘기게 되어 있는데, 그 이름이 중복될 경우 원치않는 동작을 할 수 있습니다. 이를 해결하기 위해서 뮤텍스 이름으로 GUID 값을 넘기면 해결할 수 있습니다.

// MyApp.h : main header file for the MyApp application
...

class CMyApp : public CWinApp
{
    ...

protected:
    HANDLE  m_hMutex;
};


// MyApp.cpp : Defines the class behaviors for the application.
#include "stdafx.h"
...

BOOL CMyApp::CMyApp()
{
    m_hMutex = NULL;

    ...
}

BOOL CMyApp::InitInstance()
{
    m_hMutex = ::CreateMutex(NULL, FALSE, _T("My App. Name-D51099F9-0FC6-4124-BC61-09B288101D0E"));
    if (::GetLastError() == ERROR_ALREADY_EXISTS)
    {
        AfxMessageBox(_T("App.는 중복 실행될 수 없습니다."));
        return 0;
    }

    ...
}

BOOL CMyApp::ExitInstance()
{
    if (m_hMutex != NULL)
        ::CloseHandle(m_hMutex);

...
}



3. 공유 메모리를 이용하는 방법
    - 특정 데이터 세그먼트 영역에 공유할 변수를 만들어 그 변수 값에 따라 처리하는 방법입니다.

// MyApp.cpp : Defines the class behaviors for the application.
#include "stdafx.h"
...

#pragma data_seg(".Shared")          // 'Shared'란 이름으로 'Data Segment'를 만든다.
long  g_lInstanceCount = 0;
#pragma data_seg()

#pragma comment(linker, "/SECTION:.Shared,rws")

...

BOOL CMyApp::InitInstance()
{
    if (g_lInstanceCount > 0)
    {
        AfxMessageBox(_T("App.는 중복 실행될 수 없습니다."));
        return 0;
    }

    g_lInstanceCount ++;

    ...
}

BOOL CMyApp::ExitInstance()
{
    g_lInstanceCount --;

    ...
}



위 3가지 방법 중에서 FindWindow() API를 이용하는 방법을 제외하면 기존 인스턴스에 대한 정보를 얻지 못해 기존 인스턴스를 윈도우즈에서 최상단(z-order)에 위치하도록 하지 못하고 있습니다. 이를 해결하기 위해 전 뮤텍스와 공유 메모리를 이용한 방법을 혼용하였습니다.
공유 메모리 영역에 최초로 실행된 인스턴스의 메인 윈도우 핸들 값을 저장하고 그 값을 이용하여 인스턴스를 컨트롤합니다.

// MyApp.h : main header file for the MyApp application
...

class CMyApp : public CWinApp
{
    ...

protected:
    HANDLE  m_hMutex;
};


// MyApp.cpp : Defines the class behaviors for the application.
#include "stdafx.h"
...

#pragma data_seg(".Shared")          // 'Shared'란 이름으로 'Data Segment'를 만든다.
HWND  g_hwndInstance = NULL;
#pragma data_seg()

#pragma comment(linker, "/SECTION:.Shared,rws")

...

BOOL CMyApp::CMyApp()
{
    m_hMutex = NULL;

    ...
}

BOOL CMyApp::InitInstance()
{
    m_hMutex = ::CreateMutex(NULL, FALSE, _T("My App. Name-D51099F9-0FC6-4124-BC61-09B288101D0E"));
    if (::GetLastError() == ERROR_ALREADY_EXISTS)
    {
        if (g_hwndInstance != NULL)
        {
            ::SetForegroundWindow(g_hwndInstance);
            if (::IsIconic(g_hwndInstance))
                ::ShowWindow(g_hwndInstance, SW_SHOWDEFAULT);
        }
        return FALSE;
    }

    ...

    if (g_hwndInstance == NULL)
        g_hwndInstance = m_pMainWnd;

    ...
}

BOOL CMyApp::ExitInstance()
{
    if (m_hMutex != NULL)
        ::CloseHandle(m_hMutex);

추신. http://www.flounder.com/nomultiples.htm에 가보시면 Joseph M. Newcomer 이란 분이 아주 상세하게 설명해 놓으셨습니다.

728x90

'리버싱' 카테고리의 다른 글

unpack_dragonarmour  (0) 2011.09.06
Simple IDA Pro plugin to look up APIs on MSDN  (0) 2011.08.17
SHELLCODE 의 코드 이해하는 방법  (0) 2011.07.29
CVE-2011-0222_WinXP_Exploit  (0) 2011.07.29
ida 단축키  (0) 2011.07.28
posted by 블르샤이닝 2011. 8. 5. 16:17
728x90

해당 툴은 아이스스워드나 gmer처럼 루트킷 탐지 및 커널 변경사항을 찾을 수 있는 프로그램입니다.

 갠적으로 몇몇 악성파일에서 gmer나 아이스스워드를 막아놨는데 이건 되는군요 ㅎㅎ

 

XueTr.zip

728x90

'리버싱 > ' 카테고리의 다른 글

SSDEEP - 해쉬 유사도 비교 툴  (0) 2015.09.04
한글 문서 분석할때 유용한 툴  (0) 2015.06.23
쉘코드 분석 툴  (0) 2014.10.22
[Portable_OllySND.exe] 포터블 올리디버거  (0) 2014.04.24
64비트 올리디버거  (0) 2013.11.20
posted by 블르샤이닝 2011. 7. 29. 17:16
728x90

1. 모질라를 열어

 

 세번째 메뉴인 코드 해석부분에 메뉴를 선택하여 TXT부분에 쉡코드 부분을 넣는다.

그다음 이번 CVE같은 경우는 UCS2 TO HEX 형태로 위와 같은 HEX값을 얻을 수 있었다.

마지막으로

 위에 SHELLCODE ANALYZER 를 누르고 아래와 같이 복한것을 붙여넣어주기를 해주면 위와 같은 HEX값으로된 실행 코드들이 보이게 된다.  

 

 

728x90