security/리버싱핵심원리 29

[미완][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..

Code Injection

Code Injection (Thread Injection) - 우리가 원격에서 실행하고픈 코드가 있을 때, 이를 DLL 파일 형태로 만든 후 CreateRemoteThread() 인자로 LoadLibraryA() API 주소와 dll name 주소를 건네주어 DLL을 inject하고 DllMain에서 코드를 실행시킴 => 흔적이 많이 남음(새로운 dll 로드되면 process explorer에서 즉시 확인 가능), 메모리 많이 차지 - 상대 프로세스에 독립실행 코드(Thread Procedure)과 데이터(Thread Parameter)만 삽입해 CreateRemoteThread()로 해당 thread를 실행시켜보자 => 메모리 덜 차지, 흔적 거의 남지 않음, 별도의 DLL 파일 필요 없음, 규모 작..

PE 패치를 이용한 DLL Injection

PE 파일에서 myhack3.dll을 임포트하도록 IDT를 비롯해 TextView.exe PE patch를 진행해보자. Step1. IDT 주소 확인 IDT는 .rdata 섹션에 포함되어 있으며, RAW = 0x84CC - 0x6000 + 0x5200 = 0x76CC 이고, IID 구조체(크기 0x14) 5개로 구성되어 있다. Step2. IDT 마지막에 IID 구조체 추가 여부 파악 .rdata 섹션을 살펴보면 IDT 다음에 바로 INT가 등장하므로 IID 구조체 덧붙일 수 없음 IDT를 파일의 빈 영역에 (NULL padding이면서 메모리에 로드되는 영역) 옮기면 됨 .rdata file offset: 0x5200 ~ 7E56 (사용되는 영역), 0x7E57 ~ 0x7FFF (NULL padding..

EjectDll.exe 구현

// EjectDll.exe #include "windows.h" #include "tlhelp32.h" #include "tchar.h" #define DEF_PROC_NAME L"notepad.exe" #define DEF_DLL_NAME L"myhack.dll" // process 이름 가지고 PID 찾기 DWORD FindProcessID(LPCTSTR szProcessName) { DWORD dwPID = 0xFFFFFFFF; HANDLE hSnapshot = INVALID_HANDLE_VALUE; // 시스템 스냅샷의 핸들 PROCESSENTRY32 pe; // 프로세스 정보 저장할 구조체 pe.dwSize = sizeof(PROCESSENTRY32); // 구조체 크기 초기화 hSnapsho..

SetWindowsHookEx()를 이용한 DLL Injection

사실 Windows 메시지 후킹 방법이랑 동일하다. 1) 마우스 이벤트에 훅을 걸고 2) calc.exe에서 우클릭 발생 시 "https://web2.0calc.com/" 가 크롬으로 열리는 식으로 구현 // ClickHook.dll #include "stdio.h" #include "windows.h" #define DEF_PROC_NAME "calc.exe" #define CHROME_PATH "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe" #define CALC_SITE "https://web2.0calc.com/" HINSTANCE g_hInstance = NULL; HHOOK g_hHook = NULL; BOOL WINAPI DllMa..

CreateRemoteThread()를 이용한 DLL Injection

// InjectDll.exe #include "windows.h" #include "tchar.h" // MSDN에서 제공 BOOL SetPrivilege(LPCTSTR lpszPrivilege, BOOL bEnablePrivilege) { TOKEN_PRIVILEGES tp; HANDLE hToken; LUID luid; // 현재 프로세스의 핸들을 가져와 관련된 액세스토큰을 가져옴 if( !OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken) ) { _tprintf(L"OpenProcessToken error: %u\n", GetLastError()); return FALSE; } // 로컬 시스템에..

HookMain.exe / KeyHook.dll 디버깅

[HookMain.exe] 1) Main 함수 찾기 - Visual C++ stub 코드 존재 (CALL HookMain.01161779 Step over / 들어가서 Ctrl+F9으로 탈출) - HookMain.011610B0 으로 가서 Ctrl+F8 (tracing) 시작 - Main 함수에 bp 걸고 분석 시작 - 또 다른 쉬운 방법은 Search for All referenced text strings (메인함수에서 사용되는 문자열 알기 때문) 2) Main 함수 분석 - CALL EBX 명령어를 따라 들어가면 (Ctrl+F7, Step in) - 73DD1020으로 Jump(Ctrl+G)하면 KeyboardProc() 코드 존재 [KeyHook.dll] 1. 실행중인 notepad.exe att..