[dreamhack] Inject ME!!!

Monitor In Secure☃️·2024년 4월 30일

wargame_rev

목록 보기
6/11
post-thumbnail

ida에 로드)

디컴파일 결과)

BOOL __stdcall DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
  if ( fdwReason == 1 )
    sub_1800011A0(hinstDLL);
  return 1;
}

dll 앤트리 포인트 또한 확인해보았다.


sub_1800011A0
)

int sub_1800011A0()
{
  int result; // eax
  unsigned __int64 i; // [rsp+20h] [rbp-2D8h]
  unsigned __int64 k; // [rsp+28h] [rbp-2D0h]
  unsigned __int64 j; // [rsp+30h] [rbp-2C8h]
  char *Str1; // [rsp+38h] [rbp-2C0h]
  CHAR Text[4]; // [rsp+58h] [rbp-2A0h] BYREF
  int v6; // [rsp+5Ch] [rbp-29Ch]
  int v7; // [rsp+60h] [rbp-298h]
  int v8; // [rsp+64h] [rbp-294h]
  int v9; // [rsp+68h] [rbp-290h]
  int v10; // [rsp+6Ch] [rbp-28Ch]
  int v11; // [rsp+70h] [rbp-288h]
  int v12; // [rsp+74h] [rbp-284h]
  int v13; // [rsp+78h] [rbp-280h]
  int v14; // [rsp+7Ch] [rbp-27Ch]
  int v15[16]; // [rsp+80h] [rbp-278h] BYREF
  CHAR Filename[272]; // [rsp+C0h] [rbp-238h] BYREF
  CHAR pszPath[272]; // [rsp+1D0h] [rbp-128h] BYREF

  GetModuleFileNameA(0LL, Filename, 0x104u);
  Str1 = PathFindFileNameA(Filename);
  result = strncmp(Str1, "dreamhack.exe", 0xDuLL);
  if ( !result )
  {
    memset(v15, 0, sizeof(v15));
    for ( i = 0LL; i < 0x10; ++i )
    {
      GetModuleFileNameA(0LL, pszPath, 0x104u);
      v15[i] = __ROL4__(*(_DWORD *)PathFindFileNameA(pszPath), i);
    }
    sub_180001010(v15);
    for ( j = 0LL; j < 0x64; ++j )
      sub_180001060();
    *(_DWORD *)Text = 1775475848;
    v6 = 926668331;
    v7 = 2010799913;
    v8 = 1005204386;
    v9 = -999457954;
    v10 = 1958751758;
    v11 = -1319895682;
    v12 = 1873281418;
    v13 = 1481654649;
    v14 = -671573750;
    for ( k = 0LL; k < 0xA; ++k )
      *(_DWORD *)&Text[4 * k] ^= sub_180001060();
    return MessageBoxA(0LL, Text, "flag", 0);
  }
  return result;
}

MessageBox를 통해 flag를 출력하고 있다.
strncmp함수를 통해 Str1(PathFindFileNameA(Filename))과 "dreamhack.exe"를 비교하고 있고, result가 0이 아니면 조건문을 수행한다. 즉, strcmp로 위 두 개를 비교한 후 맞으면 flag를 출력한다.

따라서 실행된 파일 이름이 'dreamhack.exe'어야 한다는 것을 알 수 있있기 때문에 dreamhack.exe라는 이름의 파일에서 이 dll을 실행시키면 된다.

관련 exploit code)

#include "stdio.h"
#include "windows.h"

int main()
{
	LoadLibraryA("prob_rev.dll");
	return 0;
}

플래그가 잘 출력되었다.

처음에 'LoadLibrary("dll파일");' 이렇게 했다가 플래그가 출력이 안되서 의문이었다. 구글링해봤을 때 다른 곳에는 잘 출력된 것 같았는데, 안되서 당황했었다. 결론은 내 컴퓨터에서는 'LoadLibraryA' 함수를 이용해야한다는 간단한 문제였다.

해당 코드는 'Visual Studio code'라는 프로그램을 사용하여 코드 입력과 디버거를 이용하여 실행시켰다.

0개의 댓글