security/리버싱핵심원리 29

SEH [Structured Exception Handling]

OS의 예외 처리 방식 1. 일반 실행의 경우 - 프로세스에게 처리를 맡김. - SEH가 구현되어있다면 예외 처리 후 진행, 없다면 OS 기본 예외 처리기 동작시켜 프로세스 종료 2. 디버깅 실행의 경우 - 우선적으로 디버거에게 예외를 넘김 - 디버거는 디버기 내부에서 발생하는 모든 예외/에러 상황을 처리해야함 - 예외 직접 수정하거나, 예외를 디버기에게 넘겨서 디버기의 SEH가 처리하도록 (Shift + F7/F8/F9) Window OS 예외 종류 - EXCEPTION_ACCESS_VIOLATION (0xC0000005) - EXCEPTION_ARRAY_BOUNDS_EXCEEDED (0xC000008C) - EXCEPTION_BREAKPOINT (0x80000003) // ex) software bp..

TEB & PEB 정리

TEB (Thread Environment Block) - 프로세스에서 실행되는 스레드에 대한 정보를 담고 있는 구조체 [offset 0x0: NtTib] - _NT_TIB 구조체 존재 - 0x0 offset의 ExceptionList = SEH (윈도우 OS 예외처리 메커니즘)의 시작주소 - 0x18 offset의 Self = _NT_TIB 구조체의 셀프 포인터 = TEB 구조체의 포인터 typedef struct _NT_TIB { struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList; PVOID StackBase; PVOID StackLimit; PVOID SubSystemTib; union { PVOID FiberData; DWORD Version; }; P..

TLS 콜백 함수

TLS (Thread Local Storage) - 스레드별로 가지는 독립된(고유한) 데이터 저장 공간 - 각각의 스레드는 고유한 스택을 갖기 때문에 스택 변수(지역 변수)는 스레드 별로 고유하다. 그러나 정적 변수와 전역 변수의 경우에는 프로세스 내의 모든 스레드에 의해서 공유된다 (= 공유 메모리 영역에 놓인다) - 정적(static) 변수, 전역(global) 변수를 각각의 스레드에게 독립적으로 만들어 주고 싶을 때 사용한다 - 같은 문장(context)을 실행하고 있지만 실제로는 스레드 별로 다른 주소 공간을 상대로 작업하게 됨 TLS 콜백 함수 - 프로세스의 스레드가 생성/종료될 때마다 자동으로 호출되는 콜백 함수 - 쓰레드 전용으로 쓰이는 'TLS'와 특정 이벤트에 의해 호출되는 'Callba..

CreateRemoteThread()를 이용한 DLL Injetcion의 한계

Windows 7부터 적용된 세션 관리 정책 - 시스템 프로세스들과 서비스 프로세스들이 실행되는 시스템 세션(Session ID=0)과 로그온 사용자의 세션(Session ID>=1)을 분리 - CreateRemoteThread() API를 이용한 DLL 인젝션 기법은 1) Session 1의 사용자 세션에서 실행되는 프로세스 대상으로는 잘 동작하지만 2) Session 0의 시스템 세션에서 실행되는 프로세스 대상으로는 동작하지 x 해결 방법 - Kernel32!CreateRemoteThread() API 내부에서 remote thread를 생성할 때 ZwCreateThreadEx()를 이용해 suspend 모드로 생성하는데, 만약 리모트 프로세스가 Session 0이라면 (CreateSuspended ..

ASLR 제거

ASLR - PE 파일이 "메모리에 로딩될 때" 로딩 시작 주소 값을 랜덤하게 바꾼다 * RVA of EP=0x12AE이고, EXE 파일의 ImageBase는 0x00400000이므로 EP=4012AE이다. * ASLR이 적용되면 "빌드 시마다" EXE 파일의 ImageBase 값이 달라진다 - 해당 프로세스의 스택/힙 시작 주소도 "실행될 때마다" 랜덤하게 바뀐다 * ASLR_no.exe의 경우 스택 주소 일정. ASLR.exe의 경우 실행 시마다 스택 주소 달라짐 ASLR 세팅 in visual C++ ASLR 적용 / 미적용 차이 1) .reloc 섹션 존재여부, IMAGE_FILE_HEADER.Characteristics - ASLR_no.exe에는 .reloc 섹션이 존재하지 않으므로 - IMA..

API 코드 패치를 이용한 API hooking - notepad.exe 프로세스 은폐하기 (2)

글로벌 API 후킹 1. 현재 실행중인 모든 프로세스에 대해 API 후킹 - (1)에서 ZwQuerySystemInformation API 이용 2. 앞으로 실행될 모든 프로세스에 대해 API 후킹 - CreateProcess API 이용 2-1. CreateProcessA / CreateProcessW 모두 후킹해야하는 번거로움, 자식 프로세스가 후킹되지 않은 채로 실행될 가능성존재 - ZwResumeThread API 이용 HideProc2.exe 코드 구현 - HideProc.exe랑 동일, 은폐 프로세스 이름이 "notepad.exe"로 하드코딩 - "stealth2.dll"은 모든 프로세스가 인식할 수 있는 경로인 %system32%(C:\Windows\System32)에 위치함. 따라서 dll..

API 코드 패치를 이용한 API hooking - notepad.exe 프로세스 은폐하기 (1)

API 코드 패치 방법 - API 코드 시작 5바이트 값을 JMP xxxxxxxx 명령어(후킹 함수로 점프)로 패치 - 후킹하려는 API 코드의 길이가 최소 5바이트보다 커야 한다 - 반복적인 unhook/hook으로 성능 저하 - 멀티스레드 환경에서 프로세스의 다른 thread에서 해당 API를 read하고 있을 때 코드 패치를 시도하면 Access Violation Error 발생할 수 있음 (스레드 간 충돌) => 핫 패치 방식 (7바이트 코드 패치) - API 코드 바로 위에 5바이트의 'NOP' 명령어 존재하고 'MOV EDI, EDI' 명령어로 시작하는 API에 한해 가능 - API 코드 직전 5바이트를 FAR JMP 명령어로 변경(사용자 후킹 함수로 점프) - API 시작 코드 2바이트를 S..

[API 후킹] IAT 조작을 이용한 메모장 암호화/복호화 (완)

InjectEjectDll.exe 코드 // InjectEjectDll.exe #include "stdio.h" #include "windows.h" #include "tlhelp32.h" #include "tchar.h" // Debug API를 사용하기 위해 엑세스 토큰의 privilege 변경 BOOL SetPrivilege(LPCTSTR lpszPrivilege, BOOL bEnablePrivilege) { TOKEN_PRIVILEGES tp; HANDLE hToken; LUID luid; if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hToken)) { _tprintf(L"OpenProcessToke..

IAT 조작하여 API 후킹 - 한글이 출력되는 계산기

API 후킹 방식 - DLL Injection을 통해 타깃 프로세스의 IAT에 저장된 원함수 주소를 후킹 함수 주소로 조작 - 후킹하고자 하는 API가 대상 프로세스의 IAT에 존재하지 않으면 후킹 불가 타겟 API 파악하기 - 실행 중인 calc.exe에 Ollydbg attach, calc 모듈에서 호출하는 API들 목록 중 의심스러운 API들에 전부 bp ex) DrawTextW, DispatchMessageW, LoadStringW, PostMessageW, SetWindowTextW 등등 - 입력값에 대한 힌트는 'SetWindowTextW' API에서 찾을 수 있었다 => 후킹 대상 구현 코드 - InjectDllForHook.exe // InjectDllForHook.exe #include ..

[미완][API 후킹] 디버그(Debug) 기법을 이용한 후킹 - 메모장 암호화/복호화

타켓 API 확인 - 파일로 저장할 버퍼 관련: kernel32!WriteFile API - 파일로 불러올 버퍼 관련: ??? => ReadFile, CreateFile, CreateFileMapping 등이 의심스럽다 1) ReadFile인지 검증 - notepad 모듈에서 해당 API 호출하는 코드에 bp 걸고 달렸는데 멈추지 않음. 아니다!! 2) CreateFile & CreateFileMapping (+ MapViewOfFile ?) -알아보니 지정된 파일에 대한 명명되거나 명명되지 않은 파일 매핑 개체를 만들거나 여는 함수는 MapViewOfFile라고 함! - 파일 open시 CreateFile -> CreateFileMapping -> MapViewOfFile 순으로 API 호출이 이루어진..