전체 글 326

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 호출이 이루어진..

[미완][API 후킹] 디버그(Debug) 기법을 이용한 메모장 WriteFile() 후킹

Target API 확인 - Process Monitor로 Notepad.exe에서 파일을 저장하는 순간을 확인해보자 - 열려있는 notepad.exe의 PID, 저장할 파일의 이름을 필터에 세팅 후 저장 진행해보면 - 어떤 API들의 호출이 발생했는지 확인 가능 => kernel32.dll!WriteFile() API 의심 가능! BOOL WriteFile( [in] HANDLE hFile, [in] LPCVOID lpBuffer, // 파일에 쓸 데이터를 포함하는 버퍼 포인터 [in] DWORD nNumberOfBytesToWrite, // 파일에 쓸 바이트 수 [out, optional] LPDWORD lpNumberOfBytesWritten, [in, out, optional] LPOVERLAPP..

Code Injection - using assembly

CodeInjection.exe를 디버깅하면서 생각했다. 어셈블리로 ThreadProc()을 짠 후 바이트 코드 배열을 넘겨주어도 되겠다 Assembly code of ThreadProc 1 PUSH EBP 2 MOV EBP, ESP 3 PUSH ESI 4 MOV ESI, DWORD PTR SS:[EBP+8] 5 CALL 7 6 ASCII "user32.dll\x00" 7 CALL DWORD PTR DS:[ESI]; LoadLibraryA("user32.dll") 8 CALL 10 9 ASCII "MessageBoxA\x00" 10 PUSH EAX 11 CALL DWORD PTR DS:[ESI+4]; GetProcAddress(hMod, "MessageBoxA") 12 PUSH 0 13 CALL 17 1..

반응형