Reverse Engineering
-
[리버싱 핵심원리 study] 48장 SEHReverse Engineering 2021. 2. 16. 23:19
1. SEH SEH(Structured Exception Handler)는 Windows 운영체제에서 제공하는 예외 처리 메커니즘이다. 리버싱에서는 이를 활용하여 안티 디버깅 기법으로 적용되기도 한다. - SEH 예제 실습#1 예제 파일 seh.exe는 의도적으로 Memory Access Violation을 발생시킨 후, SEH에 새로 Handler를 추가하여 간단한 안티 디버깅 기능을 만든 파일이다. 일반적으로 실행했을 때와 디버거를 통해 실행했을 때 다음과 같은 차이를 보인다. seh.exe 파일을 디버깅함으로써 SEH를 통해 프로세스의 예외처리를 하는 방법에 대해 알아보자. 2. OS의 예외 처리 방법 - 일반 실행의 경우 프로세스가 실행 중에 예외가 발생하면 프로세스에게 예외처리를 맡긴다. 만약 ..
-
[리버싱 핵심원리 study] 46장 TEB & 47장 PEBReverse Engineering 2021. 2. 15. 21:34
1. TEB(Thread Environment Block) 프로세스에서 실행되는 스레드에 대한 정보를 담고 있는 구조체로, 스레드 별로 TEB 구조체가 하나씩 할당된다. OS 종류별로 구조체 형태가 달라진다. MSDN에 기술된 TEB 구조체는 아래와 같다. typedef struct _TEB { PVOID Reserved1[12]; PPEB ProcessEnvironmentBlock; PVOID Reserved2[399]; BYTE Reserved3[1952]; PVOID TlsSlots[64]; BYTE Reserved4[8]; PVOID Reserved5[26]; PVOID ReservedForOle; PVOID Reserved6[4]; PVOID TlsExpansionSlots; } TEB, *PT..
-
[리버싱 핵심원리 study] 45장 TLS 콜백 함수Reverse Engineering 2021. 2. 13. 13:45
TLS 콜백 함수는 EP 코드보다 먼저 실행되어 안티 디버깅 기법으로 활용되기도 한다. 1. 실습 #1 - HelloTls.exe 예제 파일인 HelloTls.exe를 실행시켜보자. 위와 같이 메시지 박스를 출력하는 간단한 프로그램이다. 이번에는 OllyDbg로 HelloTls.exe를 열어보자. 그러자 위와 같은 메시지 박스가 나타나며 확인 버튼을 누르면 그대로 프로세스가 종료된다. 일반적인 프로그램과 동작이 다른 이유는 EP 코드보다 먼저 실행되는 TLS 콜백 함수에서 Anti-Debugging 코드가 실행되었기 때문이다. 해당 원리를 이해하지 못하면 디버깅을 진행할 수가 없다. 2. TLS TLS란 Thread Local Storage의 준말로 스레드별로 독립된 데이터 저장 공간을 가리킨다. TLS..
-
[리버싱 핵심원리 study] 41장 ASLRReverse Engineering 2021. 2. 8. 19:31
ASLR(Address Space Layout Randomization)은 Windows Vista 이후부터 지원되는 기능으로, PE 파일이 메모리에 로딩될 때 로딩 시작 주소를 랜덤 하게 바꿔주는 기능이다. 이로 인해 프로세스의 스택, 힙의 시작 주소도 랜덤 하게 바뀐다. 모든 실행 파일에 적용되는 기술은 아니며, 아래와 같은 두 가지 조건을 만족해야 한다. (1) OS의 Kernel Version이 6이상 (Vista 이상) (2) 개발 도구에서 /DYNAMICBASE 옵션 지원 위 조건 중 (2)는 Visual C++의 경우 프로젝트 속성의 링커-> 고급 메뉴에서 확인해 볼 수 있다. 만약 ASLR 기능을 원하지 않을 경우 옵션에서 /DYNAMICBASE:NO로 설정해주면 된다. 1. ASLR.ex..
-
[리버싱 핵심원리 study] 40장 64비트 디버깅Reverse Engineering 2021. 2. 8. 18:51
이번 장에서는 동일한 소스코드를 x86와 x64 환경으로 컴파일했을 때, 어셈블리 코드가 어떻게 달라지는지 비교해본다. 책이 집필될 당시에는 x64dbg가 없어서 그런지 64bit 프로그램을 디버깅할 때 WinDbg를 이용한다. 단순 실행파일의 디버깅이 목적이라면 x64dbg가 편리할 것 같지만 이후에 커널 디버깅 등을 할 때는 WinDbg를 이용하므로, 익숙해질 겸 이번 포스팅에서도 책에서와 같이 WinDbg를 이용해보겠다. 1. 소스코드(WOW64Test.cpp) #include "stdio.h" #include "windows.h" #include "Shlobj.h" #include "tchar.h" #pragma comment(lib, "Shell32.lib") int _tmain(int argc..
-
[리버싱 핵심원리 study] 38장 PE32+Reverse Engineering 2021. 2. 2. 19:55
64bit Windows OS에서 사용되는 실행 파일 형식인 PE32+에 대해 알아본다. 예가 필요한 경우 notepad.exe의 32bit 버전과 64bit 버전의 비교를 해보자. 1. PE32+(PE+, PE64) (1) IMAGE_NT_HEADERS - 32bit typedef struct _IMAGE_NT_HEADERS { DWORD Signature; IMAGE_FILE_HEADER FileHeader; IMAGE_OPTIONAL_HEADER32 OptionalHeader; } IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32; - 64bit typedef struct _IMAGE_NT_HEADERS64 { DWORD Signature; IMAGE_FILE_HEADER F..
-
[리버싱 핵심원리 study] 37장 x64 프로세서 이야기Reverse Engineering 2021. 2. 1. 19:11
1. x64에서 추가/변경된 사항 (1) 64비트 메모리 주소가 64bit(8byte)로 표현된다. 마찬가지로 레지스터와 스택의 기본 단위도 64bit로 증가하였다. (2) 메모리 가상 메모리의 크기가 2^64 = 16TB로 증가하였으며, User 영역 및 kernel 영역이 각각 8TB의 크기를 갖는다. (이론상 그러하며 실제로 사용되는 영역은 이보다 적다.) (3) 범용 레지스터 레지스터들이 64bit로 확장되었으며, R8 ~ R15 레지스터가 추가되었고, R로 시작한다. (ex. EAX->RAX로 변경, RAX의 하위 32bit가 EAX) (4) CALL/JMP Instruction 똑같은 기능을 하는 다음 두 명령어를 살펴보자. - x86 => Addresss : 00401000 FF1500504..
-
[리버싱 핵심원리 study] 36장 64비트 컴퓨팅Reverse Engineering 2021. 2. 1. 15:02
36장의 핵심 내용만 요약해봤다. - WOW64 32bit와의 호환성을 위해 기존 32bit 응용프로그램을 64bit OS에서 실행시켜주는 메커니즘. 64bit 응용프로그램은 64bit용 dll을 로드하고 32bit 응용프로그램은 32bit용 dll을 로드하는데, 중간의 'WOW64'가 ntdll.dll(32bit)의 요청을 ntdll.dll(64bit)로 redirection 해준다. - 폴더구조 System32에는 64bit용 시스템 파일들이, SysWow64 폴더에는 32bit용 시스템 파일들이 존재한다. Program Files 폴더도 Program Files(64bit용)와 Program Files(x86)(32bit용)으로 나뉜다. - 레지스트리 역시 마찬가지로 32bit용과 64bit용으로 ..