본문 바로가기

High Level Technique/Reversing

Obfuscation (난독화) Obfuscation (난독화) 위 소스코드를 보면 IsDebuggerPresent()를 이용해서 현재 프로그램이 디버깅 중인지 아닌지 판단을 할 수 있습니다. IDA를 이용해 해당 부분을 살펴보도록 하겠습니다. 위 사진을 보면 CALL IsDebuggerPresent가 나타납니다. 그리고 디버깅 중이라면 "디버깅 중"이 출력되고 디버깅 중이 아니라면 "정상 실행 중"이 출력이 됩니다. 여기서 IDA를 이용해서 정적분석을 진행하면 IsDebuggerPresent()가 있다는 것을 알게되므로 이 부분을 나타나지 않도록 해야합니다. 해당 부분이 IsDebuggerPresent() 부분입니다. 해당 부분에서 EB를 넣어 코드를 수정해주면 정적분석시에 IsDebuggerPresent()인지 알 수 없게되어 분석.. 더보기
Native API Native API Native API는 윈도우 NT 시스템의 실질적인 인터페이스입니다. Win32 API는 Native API에 대한 상위 계층일 뿝이고 NT 커널은 GUI와 아무런 관련이 없기 때문에 Native API는 그래픽관련 서비스를 포함하지 않습니다. 메모리 관리자, I/O 시스템, 객체 관리자, 프로세스와 스레드 등에 직접 접근할 수 있는 인터페이스를 제공하므로 윈도우 커널에 대한 가장 직접적인 인터페이스 입니다. Native API는 NTDLL.DLL과 NTOSKRNL.EXE에서 익스포트된 함수들의 집합입니다. Navtive API는 Nt나 Zw로 시작하는 API가 존재하는데 Nt로 시작하는 API는 API를 실질적으로 구현하는 함수이고, Zw는 시스템 콜 메커니즘이 수행되는 함수 입니다.. 더보기
C++ 분석 C++ 분석 C++는 어셈블리어로 보게 되면 난해한 상태로 분석을 해야합니다. 어느 부분이 클래스인지 어느 부분이 구조체인지 쉽게 파악할 수 없습니다. 하나씩 분석해보도록 하겠습니다. 123456789101112131415161718192021222324252627282930313233343536373839404142#include #include #include class Employee{public: int number; char name[128]; long pay; void ShowData(); void Test();}; void Employee::ShowData(){ printf("Number: %d\n", number); printf("Name: %s\n", name); printf("pay: .. 더보기
Debug Blocker Debug Blocker Debug Blocker 기법은 자기 자신을 디버깅 모드로 실행하는 기법입니다. 부모 프로세스와 자식 프로세스간의 관계가 디버거 - 디버기 관계로 이루어져 있기 때문에 디버기인 자식프로세스에 중요 코드가 존재한다면 자식 프로세스를 디버깅해야 합니다.하지만 디버거 - 디버기 관계가 안티 디버깅 역할을 하기 때문에 디버깅하기가 어렵습니다. 중점사항 1. 부모 - 자식 관계 디버거 - 디버기 관계는 부모 - 자식 프로세스 관계이기 때문에 Self Creation 기법에서와 같이 디버깅을 하기 어려워 집니다. 2. 디버기 프로세스는 다른 디버거에서 디버깅 불가 Windows 운영체제에서 여러 디버거로 동시에 같은 프로세스를 디버깅 할 수 없습니다. 3. 디버거 프로세스를 종료하면 디버기.. 더보기
PE Image Switching PE Image Switching PE Image Switching은 다른 프로세스를 실행한 후에 가상 메모리의 PE Image를 자신의 것과 바꾸는 것을 말합니다. PE 구조를 공부했을때 아래와 같은 그림을 봤었습니다. 일반적으로 PE 파일은 file Alignment와 Section Alignment가 다르고 각 섹션의 Raw Data Size 와 Virtual Size가 다르기 때문에 PE Image 사에 형태가 달라집니다. PE Image Switching A.exe 를 SUSPEND 모드로 실행한 후 B.exe의 PE Image를 Mapping 시켜 A.exe 프로세스 메모리 공간에서 실행하는 기법입니다. PE Image를 변경하면 프로세스는 A.exe 이지만 메모리 공간에 매핑된 PE Imag.. 더보기
Self Creation Debugging Self Creation Debugging Self Creation Debugging은 실행 중 자기 자신을 자식 프로세스로 생성시키는 프로그램을 디버깅하는 것을 말합니다.같은 프로그램이지만 부모 프로세스로 실행될 때와 자식 프로세스로 실행될 때 다르게 동작합니다. 동작원리 Create Child Process (SUSPEND mode) 부모 프로세스가 실행되면 main()이 호출되는데 자식 프로세스를 SUSPEND 모드로 생성합니다. SUSPEND 모드로 생성되면 Import DLL은 로딩 되지만 Main Thread가 멈춘상태가 됩니다.main thread는 프로세스가 생성될 때 기본적으로 생성되는 thread 인데, EP 코드를 실행시키는 역할을 담당하고 있습니다. SUSPEND 모드로 실행된 프로.. 더보기
Service Debugging Service Debugging Service Process 동작 원리 서비스 프로그램은 Service Control Manager(이하 SCM)에서 관리됩니다. 서비스 프로그램이 실행 되려면 Service Controller가 필요합니다.Service Controller가 서비스 제어 요청을 하면 SCM이 서비스 프로그램에 제어 명령을 전달하고 리턴 값을 받습니다. Service Controller 서비스 컨트롤러는 제어판 - 서비스를 실행하면 나타납니다. 또는 실행 - services.msc 를 실행해도 됩니다. 위 Service Controller에 들어가게 되면 시스템에 설치된 서비스 목록들이 나타나게 됩니다. 서비스 시작 과정 1. Service Controller에서 StartService().. 더보기
Advanced Anti Debugging Advanced Anti Debugging PE Protector에서 주로 사용되는 기법의 공통된 특징은 리버싱을 하는 사람을 힘들게 합니다.가비지 코드, 조건 분기문, 루프문, 암호화/복호화 코드 그리고 Call_Tree에 빠져서 정작 분석하고 싶은 코드에 접근 조차 못하게 합니다. Garbage Code 말 그대로 쓰레기 코드 입니다. 아무 의미없는 어셈블리어들을 이용해서 분석을 어렵게 합니다. 아니면 단순히 JMP 0x00000000과 같은 명령을 통해서 간단히 구현이 가능한 것을0x00000000을 여러 연산을 통해서 만들어 내기도 합니다. Breaking Code Alignment 디스 어셈블리 코드를 깨트리는 것을 말합니다. 예를 들어 JMP 0x12345678 명령어가 있는데 해당 주소가 정.. 더보기
Anti Debugging - Dynamic Anti Debugging - Dynamic Dynamic Anti Debugging은 프로그램의 코드를 트레이싱 하지 못하도록 지속적으로 방해하는 기법입니다.내부 코드와 데이터를 리버싱으로부터 감추고 보호하는 것을 말합니다. PE Protector에서 많이 사용되고 원본 프로그램의 핵심 알고리즘을 보호하기 위해서 사용됩니다.OEP로 가지 못하도록 방해합니다. 예외 안티 디버깅에서 예외를 이용하는 방법이 많이 나옵니다. 정상적으로 실행된 프로세스에서 예외가 발생하면 SEH 메커니즘에 의해 OS에서 예외를 받아서 프로세스에 등록된 SEH를 호출합니다.하지만 디버깅을 하는 경우 프로세스에서 예외가 발생하면 디버거에서 예외를 담당합니다. 이러한 방식을 이용해서 정상 실행되는 경우와 디버깅 상태에서 실행되는 경.. 더보기
Anti Debugging - Static Anti Debugging - Static 프로세스에서 자신이 디버깅 당하는지 여부를 파악하는 기법입니다. 만약 디버깅 중이라고 판단되면 일반 실행과 다른 코드를 실행하는 것입니다.디버거를 탐지하거나 디버깅 환경을 탐지하거나 디버거를 강제 분리 시키는 방법이 있습니다. 대부분의 Static Anti Debugging은 OS에 의존하고 있어서 XP에서는 되는데 7에서는 안되고 7에서는 되는데 10에서는 안되는 경우가 있습니다. Process Envritonment Block (PEB) PEB에서 BeingDebugged, Ldr, ProcessHeap, NtGlobalFlag 멤버를 확인해야 합니다. BeingDebugged 멤버는 디버깅 여부를 표시하는 Flag로 사용됩니다. Ldr, ProcessHea.. 더보기
Anti Debugging Anti Debugging 안티 디버깅은 디버거를 방해하는 것으로 특정 OS 버전에서만 동작하는 경우가 있고, 디버거의 종류에 따라서 적용되는 안티 디버깅 기법도 조금씩 다릅니다.안티 디버깅은 Static과 Dynamic 으로 나뉩니다. 안티 디버깅 분류 Static 안티 디버깅 Static 기법은 디버거를 탐지하여 프로그램이 정상적으로 실행되지 못하도록 하는 거입니다. 디버거에 프로그램을 올렸을 때 실행이 안되게 하는 것입니다. Dynamic 안티 디버깅 Dynamic 기법은 디버거 트레이싱을 방해해서 원본 프로그램의 코드와 데이터를 확인 할 수 없게 만드는 것입니다. 더보기
IA32 Instruction IA32 Insturction 추후 공부할 예정. 더보기
Structured Exception Handler (SEH) Structured Exception Handler (SEH) Structured Exception Handler (이하 SEH)는 Windows에서 제공하는 예외 처리입니다. __try, __except, __finally 키워드로 구현할 수 있습니다.C++에서 제공하는 tyr, catch와는 다릅니다. SEH가 먼저 만들어졌습니다. SEH 프로그램을 실행시키면 위 그림처럼 Hello :)를 출력해줍니다. 정상적으로 실행이 되는것 같지만 사실 내부에서 예외가 발생하여 처리가 되어서 정상실행 된 것입니다. OllyDBG를 이용해서 seh.exe를 실행시켜보면 아래와 같은 위치에서 Access violaton이 발생합니다. EAX의 값을 가져오지 못하고 있습니다. 밑에 상태창에서 Access violati.. 더보기
Process Environment Block (PEB) Process Environment Block (PEB) Process Environmnet Block (이하 PEB)는 프로세스 정보를 담고 있는 구조체 입니다. PEB는 TEB.ProcessEnvrionmentBlock 멤버가 PEB 구조체의 주소입니다. TEB 구조체는 FS Segment 셀렉터가 가리키는 세그먼트 메모리의 시작 주소에 위치하고 ProcessEnvrionmentBlock 멤버는 TEB 구조체의 시작부터 30 Offset 만큼 떨어져 있습니다. FS:[30] = TEB.ProcessEnvironmentBlock = address of PEB 어셈코드로 하면 mov eax, DWORD PTR FS:[30]이거나 mov eax, DWORD PTR FS:[18] mov eax, DWORD .. 더보기
Thread Environment Block (TEB) Thread Environment Block (TEB) Thread Environment Block (이하 TEB) 는 프로세스에서 실행되는 thread에 대한 정보를 담고 있는 구조체 입니다.thread 별로 TEB 구조체가 하나씩 할당되고, OS 종류별로 조금씩 다릅니다. VS2013에서 찾은 TEB 구조체 입니다. 핵심원리에 나와있는 구조체와는 조금 다르네요. WinDBG를 이용해서 확인해 보도록 하겠습니다. 아무 파일이나 넣어서 dt_TEB를 하면 TEB에 대한 정보가 나타납니다. Windows 10 x64환경에서 진행되었습니다. 0:000> dt_TEBntdll!_TEB +0x000 NtTib : _NT_TIB +0x038 EnvironmentPointer : Ptr64 Void +0x040 C.. 더보기
Thread Local Storage CallBack (TLS) Thread Local Storage CallBack (TLS) Thread Local Storage (TLS)는 Thread 별로 독립된 데이터 저장공간 입니다. Thrad 내에서 프로세서의 전역 데이터나 정적 데이터를 마치 지역 데이터 처럼 독립적으로 취급하고 싶을 때 사용합니다. 마찬가지로 Windows 10 환경에서 시도해 보겠습니다. OllyDBG에 붙여서 실행을 했음에도 불구하고 Hello :)가 출력이 되었습니다. 원래는 Debugger Detected!가 출력이 되어야 합니다. 그래서 혹시나 OllyDBG Plugin 때문에 그러지 않을까 싶어서 Plugin을 모두 제거하고 실행을 했지만 마찬가지 였습니다. 그래서 reversecore.com에서 직접 실습예제를 다운 받아서 실행해 봤더니 .. 더보기
DLL Injection in kernel 6 DLL Injection in kernel 6 kernel version 6 이후부터 CreateRemoteThread()가 사실상 사용이 불가능한데, 이 API를 대신해서 ZwCreateThreadEx() API를 사용하면 Injection이 된다고 합니다. Windows 10 x64 환경에서 소스코드를 작성하여 실행해 보도록 하겠습니다. 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410.. 더보기
Session in Kernel 6 Session in Kernel 6 최근 Windows 7, 10을 많이 사용할 겁니다. Winodws Vista 이후부터 Session이 6.0 으로 바뀌고, ASLR 기능이 적용되어 보안이 강화되었습니다. DLL Injection을 할 때 CreateRemoteThread()을 사용하여 Injection을 시도했었습니다. 하지만 Kernel 6.0 프로세스들에는 CreateRemoteThread()가 사용되지 않습니다. Session Session이라는 것은 로그온 사용자 환경을 말합니다. OS는 여러 사용자에게 로그온을 허가하고 각 로그온에 대해서 독립된 사용자 환경을 제공합니다. Session을 확인하는 방법은 Process Explorer에서 View 항목을 선택하면 현재 실행되고 있는 프로세스.. 더보기
Address Space Layout Randomization (ASLR) Address Space Layout Randomization (ASLR) Address Space Layout Randomization (이하 ASLR)은 Windows Vista 부터 적용된 기술입니다. (오래전에 XP SP3부터 적용되었다고 들었는데...) Windows Kernel Version Windows 2000 5.0 Windows XP 5.1 Windows Server 2003 5.2 Windows Vista 6.0 Windows Server 2008 6.0 Windows 2008 R2 6.1 Windows 7 6.1 Windows 8 6.2 Windows 8.1 6.3 Windows 10 6.4 ASLR 기능은 Kernel 6.0 이후 부터 지원되는 기능이라고 합니다. ASLR 시스템 .. 더보기
WinDBG명령어와 분석방법 WinDBG WinDBG 명령어와 실제 분석 방법에 대해서 알아보도록 하겠습니다. 명령어 분석 Reversing을 처음 시작할 때 많이 하는 abexcm1.exe를 가지고 설명하도록 하겠습니다. Windbg로 abexcm1.exe를 실행시키면 아래와 같이 int 3에 걸린 상태로 멈추게 됩니다. abexcm1이 로딩된 주소를 확인해 보니 image00400000으로 되어있습니다. EP 코드 EP 주소를 구합니다. !dh 명령어를 통해서 구할 수 있습니다. OllyDBG에서 Memory map에서 imagebase + sizeofimage를 확인하는 것과 같습니다.main을 찾기 위한거죠. Address of entry point를 확인해 보니 1000입니다. 주소 이동 그렇다면 실제 실행되는 주소로 이동.. 더보기
64비트에서 달라진 점 64비트에서 달라진 점 대부분 32비트 환경에서 리버싱을 해오면서 64비트는 단순히 주소만 확장되어 사용되고, 레지스터가 조금 달라졌다. 이정도 수준만 알고 리버싱을 했었습니다.책을 보면서 몰랐던 부분들도 많이 있어서 정리해 두면 좋겠다 싶어 작성합니다. 64bit CPU intel에서 64bit CPU인 IA-64를 만들면서 64bit에 강력한 성능을 뽑아냈습니다. 하지만 기존의 32bit와는 호환이 되지 못해서 사실상 사람들이 많이 사용하지 못했죠.그러던 중 AMD에서 32bit와 호환이 되는 AMD64를 만들게 되었고 사람들이 많이 사용했습니다. 이것을 intel이 라이센스를 사들여서 intel64로 바꾸게 됩니다. Win32 API 64bit 프로그램을 만들 때 기존의 win32 API를 그대로 .. 더보기
API Hooking - API Code Patch, Global Hooking API Hooking - API Code Patch, Global Hooking API Code Patch, Global Hooking을 이용한 Stealth Process(Rootkit) 기법에 대해서 알아보도록 하겠습니다. API Code Patch 원리 Code Patch 방식은 실제 API 코드 시작 5바이트 값을 JMP XXXX 명령어로 패치하는 방식입니다.Hooking된 API가 호출되면 JMP XXXX 명령어가 실행되어 후킹 함수로 제어가 넘어옵니다.Code Patch는 프로세스에서 사용되는 어떤 API라도 후킹을 할 수 있습니다. 제한사항으로는 API 코드의 길이가 최소 5바이트 보다 커야 한다는 것.하지만 API의 코드 크기는 5바이트 보다 크기 때문에 사실상 제한이 없다. ※ 프로세스의.. 더보기
API Hooking - IAT Hooking API Hooking - IAT Hooking Windows의 계산기에 DLL 파일을 삽입하여 IAT의 user32.SetWindowsTextW() API를 후킹하는 것을 해보도록 하겠습니다. PEViewer를 이용하여 IAT를 확인합니다. 대부분 많이 사용되는 PEView 프로그램은 64bit를 지원하지 않기 때문에 64비트 프로그램을 분석할 수가 없습니다.그래서 64비트를 지원하는 PEBrowse를 이용합니다. PEView 프로그램을 이용해서 IAT를 확인해 보면 windows 10의 계산기 프로그램에서는 SetWindowTextW() API가 나타나지 않았습니다. 그래서 혹시나 해서 디버거를 이용해서 확인해보니 user32.dll이 로딩이 되었고, SetWindowTextW가 존재했습니다. Setw.. 더보기
API Hooking - Debug Technique API Hooking - Debug Technique Debug 기법을 이용한 실습을 해보도록 하겠습니다. 핵심원리에 나와있는 notedpad.exe WriteFile()을 해볼텐데, Windows 10 x64 notepad.exe를 이용하여 해보도록 하겠습니다. 먼저 디버거 동작원리와 디버그 이벤트에 대해서 알아보도록 하겠습니다. 디버거 동작원리 프로세스가 디버거에 붙어서 실행이 되면 OS에서는 프로세스에서 디버그 이벤트가 발생할 때 해당 프로세스 실행을 정지시키고 디버거에게 전달합니다.그러면 디버거는 해당 이벤트에 대해서 처리를 한 후에 프로세스 실행을 다시 시작합니다. 일반적인 예외도 디버그 이벤트에 해당하고, 해당 프로세스가 디버깅 중이 아니라면 디버그 이벤트는 예외처리되거나 OS의 예외 처리 루.. 더보기
API Hooking API Hooking 실행 흐름을 변경하고, 원래 동작하는 기능을 다른 기능으로 바꿔 동작하도록 만드는 방법입니다. API라는 것은 Windows를 사용함에 있어서, 애플리케이션이 시스템 자원에 직접 접근할 수 있는 방법이 없습니다. 그래서 MS에서 제공하는 Win32 API를 이용합니다.쉽게 말하자면 API 또한 함수라고 생각하면 되는데, 이미 만들어져 있는 함수라고 생각하면 됩니다. 모든 프로세스에는 기본적으로 kernel32.dll 이 로딩되고, kernel32.dll은 ntdll.dll를 로딩합니다. 예외적으로 smss.exe는 kernel32.dll을 로딩하지 않습니다. API Hooking의 과정을 살펴보면 아래와 같습니다. 정상적인 호출일 경우 Process에서 CreateFile()을 호출.. 더보기
Code Injection Code Injection Code Injection은 상대방 프로세스에 독립 실행 코드를 삽인한 후 실행하는 기법을 말한다. CreateRemoteThread() API를 이용하여 원격 쓰렏 형태로 실행하기 때문에 Thread Injection이라고도 한다. Code Injection을 사용하는 이유는 메모리를 적게 차지하고, DLL Injection과 다르게 흔적을 찾기가 어렵습니다. Code Injection을 할 때 몇가지 알아 두어야 할 점이 있습니다. - 프로그램 빌드 시 Release 모드- 최적화 옵션 /0d- Data Execution Prevention (DEP) 해제 ※ Release 모드로 하는 이유는 Debug 모드로 빌드를 하게되면 코드 중간에 에러를 잡는 코드가 삽입되어 정확한.. 더보기
DLL Load Using PE Patch DLL Load Using PE Patch DLL Injection을 하면서 프로그램 내에 강제로 DLL을 삽입을 시켰습니다. 이번에는 PE 패치를 통해서 DLL을 실행시켜보도록 하겠습니다. 리버싱 핵심원리에 나와있는 TextView 프로그램과 다릅니다. 버전이 업데이트된 파일같습니다. 그래도 한번 따라서 해보도록 하겠습니다. IDT (Import Directory Table) 확인 IDT를 확인해 보면 여러가지 dll이 나타납니다. COMCTL32.dll SHLWAPI.dll KERNEL32.dll USER32.dll GDI32.dll comdlg32.dll ADVAPI32.dll SHELL32.dll ole32.dll MSVBR70.dll 핵심원리에서는 4개의 dll만 들어가 있는데 제가 받은 프로그.. 더보기
DLL Ejection DLL Ejection DLL Ejection은 프로그램이 실행되는데 DLL파일이 함께 사용되는데, 해당 프로그램에서 사용되는 DLL을 빼내는 것을 말합니다.다만, 사용자가 강제로 넣은 것만 뺄 수 있습니다. Injection에서는 LoadLibrary()를 호출하도록 했지만, Ejection에서는 FreeLibrary()를 호출하도록 합니다. Ejction도 마찬가지로 CreateRemoteThread()를 사용합니다. 다만 인자로 넘겨주는 값이 달라집니다. lpStartAddress에 FreeLibrary() 주소를 넣어주고, lpParameter에 Ejection할 DLL의 Handle을 넣어줍니다. 처음 Injection을 합니다. k3y6reak.dll 파일이 정상적으로 Injection된 것을.. 더보기
DLL Injection DLL Injection DLL Injection은 프로그램이 실행되는데 DLL 파일이 함께 사용되는데, 이 프로그램에 DLL 파일을 삽입하여 사용하는 것을 말한다. * DLL (Dynamic Linked Library)DLL은 동적 라이브러리라고 불리며, DLL이 로딩되면 DllMain()이 실행된다. DLL Injection이 활용되는 곳은 후킹, 기능 개선, 버그 패치 등등 여러 일을 할 수 있다. CreateRemoteThread() CreateRemoteThread()는 Jeffrey Ritcher에 의해서 공개되었다고 합니다. hProcess : Thread가 생성될 타겟 프로세스, Thread 생성에 성공하기 위해서는 이 Handle에 대해 PROCESS_VM_OPERATION, PROCES.. 더보기
Windows Massage Hooking Hook 이라는 단어는 고리, 걸이, 바늘 등의 뜻을 가지고 있습니다. Hook 이라는 말은 리버싱을 하면서 어떤 뜻으로 사용되나면 중간에 정보를 가로채는 것으로 사용됩니다. 간단히 설명하자면 키보드가 눌릴때 WM_KEYDOWN 메시지가 말생합니다. 이 메세지에 의해서 프로그램에서 키보드가 눌렸다라는 것을 알려주죠.이러한 메세지를 중간에 가로채는것을 Hooking이라고 합니다. Win32 API나 MFC를 해보셨다면 Window Massage에 대해서 조금은 아실 겁니다. Massage Hooking은 SetWindowsHookEx()라는 API를 이용해 간단히 구현할 수 있습니다. SetWindowsHookEx()의 원형은 다음과 같습니다. msdn에서 각 인자 값에 대한 설명은 다음과 같습니다. ht.. 더보기