공부해요/리버싱_핵심원리

40. 64비트 디버깅

yenas0 2024. 12. 26. 08:10
반응형

x64환경에서는 32비트랑 64비트 운영체제 모두 설치 가능하다. 

사용 가능한 디버거는 아래와 같음

OS PE32 PE32+
32bit OllyDbg
IDA Pro
WinDbg
IDA Pro
(disassemble only)
64bit OllyDbg
IDA Pro
WinDbg
IDA Pro
WinDbg

 

64비트 디버깅

WOW64Test_x64.exe파일 디버깅 실습

#include "stdio.h"
#include "windows.h"
#include "Shlobj.h"
#include "tchar.h"

#pragma comment(lib, "Shell32.lib")

int _tmain(int argc, TCHAR* argv[]) {
    HKEY hKey = NULL;
    HANDLE hFile = INVALID_HANDLE_VALUE;
    TCHAR szPath[MAX_PATH] = {0};

    ////////////////
    // system32 folder
    if (GetSystemDirectory(szPath, MAX_PATH)) {
        _tprintf(L"1) system32 path = %s\n", szPath);
    }

    ////////////////
    // File size
    _tcscat_s(szPath, L"\\kernel32.dll");
    hFile = CreateFile(szPath, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    
    if (hFile != INVALID_HANDLE_VALUE) {
        _tprintf(L"2) File size of \"%s\" = %d\n", szPath, GetFileSize(hFile, NULL));
        CloseHandle(hFile);
    }

    ////////////////
    // Program Files
    if (SHGetSpecialFolderPath(NULL, szPath, CSIDL_PROGRAM_FILES, FALSE)) {
        _tprintf(L"3) Program Files path = %s\n", szPath);
    }

    ////////////////
    // Registry
    if (ERROR_SUCCESS == RegCreateKey(HKEY_LOCAL_MACHINE, L"SOFTWARE\\ReverseCore", &hKey)) {
        RegCloseKey(hKey);
        _tprintf(L"4) Create Registry Key = HKLM\\SOFTWARE\\ReverseCore\n");
    }

    return 0;
}

소스코드는 위와 같다. WOW64Test에서는 크게 4개의 API(GetSystemDirectory(), CreateFile(), SHGetSpecialFolderPath(), RegCreateKey())를 호출해 결과를 출력하는 프로그램이다

 

https://github.com/reversecore/book/tree/master/%EC%8B%A4%EC%8A%B5%EC%98%88%EC%A0%9C/05_64%EB%B9%84%ED%8A%B8_%26_Windows_Kernel_6/40_64bit_Debugging/bin

 

book/실습예제/05_64비트_&_Windows_Kernel_6/40_64bit_Debugging/bin at master · reversecore/book

리버싱 핵심원리 - 소스 코드 및 실습 예제. Contribute to reversecore/book development by creating an account on GitHub.

github.com

 

 

x64파일도 있음 이거는 64비트 운영체제 에서 실행되면 WOW64모드로 실행된다.

40128F에서 Startup 코드를 찾을 수 있다.

메인함수를 찾으려면 아래 정보를 바탕으로 찾으면된다.

 

  • GetCommandLine() API 활용
    • WOW64Test_x86.exe는 콘솔 기반 프로그램으로, main(int argc, char* argv[]) 함수 호출 전에 GetCommandLine() API를 호출할 가능성이 높습니다.
    • 이를 통해 스택 또는 레지스터에 argc와 argv 파라미터가 입력되므로, GetCommandLine() API에 브레이크포인트(BP)를 설정해 리턴 주소를 확인하면 main() 호출 부분을 추적할 수 있습니다.
  • 특정 API를 활용한 추적
    • 프로그램이 GetSystemDirectory(), GetFileSize(), CreateFile() 같은 명확한 API를 호출한다면, 해당 API에 BP를 설치하여 리턴 주소를 통해 main() 함수 내부를 빠르게 찾아갈 수 있습니다.
  • 문자열 검색 기능 활용
    • 프로그램이 API로 획득한 정보를 화면에 출력한다면, OllyDbg의 강력한 문자열 검색 기능을 이용해 원하는 코드를 직접 찾아갈 수 있습니다.

 

마지막거 사용해서 찾아보도록 했다

Search for - All referenced text strings항목 선택해서..

 

 

401058주소로 가면 이런 부분이 나오는데 여기가 메인함수부분인거를 찾을 수 있다. 위로 올려보면은

시작점부터 확인가능하다. 401000부터 스택프레임이 시작하니여기가 메인함수의 시작이다.

 

이번에는 x64.exe파일을 디버깅 해보도록 하겠다.. 이대는 IDA Pro 쓰거나 WinDbg써야된다. 

64비트파일을 열어서 EP로 가서 Startup코드를 확인할 수 있다..

64비트에서는 main함수를 찾으려면 kernel32!GetCommandLineW() API에 브레이크 포인트를 설치하고 저장된 RETN addr를 확인해서 따라간서 메인함수 호출 코드를 찾으면된다..

 

이런식으로..

 

사실책으로만 도저히 실습과정이 이해가 안가고.. Windbg모ㅅ쓰겠어서 다른블로그를 참고해서 따라함.,.,.

WinDbg어렵다.,.,.,.,

 

반응형