[Dreamhack] Inject Me!!!

김성진·2022년 8월 11일
0

Dreamhack_Reversing

목록 보기
13/13

📒 Description


📒 Analysis

📖 DllEntryPoint

BOOL __stdcall DllEntryPoint(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved)
{
  if ( fdwReason == 1 )
    sub_1800018E0();
  return sub_1800015F0(hinstDLL, fdwReason, lpReserved);
}

DLL 엔트리 포인트이다. sub_1800015F0을 실행한다.

📖 sub_1800015F0

__int64 __fastcall sub_1800015F0(__int64 a1, unsigned int a2, __int64 a3)
{
  unsigned int v7; // ebx
  unsigned int v8; // eax
  __int64 v9; // rcx

  if ( !a2 && dword_180004040 <= 0 )
    return 0i64;
  if ( a2 - 1 > 1 || (v7 = sub_180001404(a1, a2, a3)) != 0 )
  {
    v8 = sub_180001390(a1, a2, a3);
    v7 = v8;
    if ( a2 == 1 && !v8 )
    {
      sub_180001390(a1, 0i64, a3);
      LOBYTE(v9) = a3 != 0;
      sub_18000156C(v9);
    }
    if ( !a2 || a2 == 3 )
      v7 = sub_180001404(a1, a2, a3) != 0;
  }
  return v7;
}

v8 부분을 보면 sub_180001390을 호출한다.

📖 sub_180001390

__int64 __fastcall sub_180001390(__int64 a1, int a2)
{
  if ( a2 == 1 )
    sub_1800011A0(a1);
  return 1i64;
}

📖 sub_1800011A0

__int64 sub_1800011A0()
{
  __int64 v1; // [rsp+0h] [rbp-2F8h] BYREF
  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]
  LPSTR v6; // [rsp+40h] [rbp-2B8h]
  LPSTR v7; // [rsp+48h] [rbp-2B0h]
  LPSTR v8; // [rsp+50h] [rbp-2A8h]
  CHAR Text[4]; // [rsp+58h] [rbp-2A0h] BYREF
  int v10; // [rsp+5Ch] [rbp-29Ch]
  int v11; // [rsp+60h] [rbp-298h]
  int v12; // [rsp+64h] [rbp-294h]
  int v13; // [rsp+68h] [rbp-290h]
  int v14; // [rsp+6Ch] [rbp-28Ch]
  int v15; // [rsp+70h] [rbp-288h]
  int v16; // [rsp+74h] [rbp-284h]
  int v17; // [rsp+78h] [rbp-280h]
  int v18; // [rsp+7Ch] [rbp-27Ch]
  int v19[16]; // [rsp+80h] [rbp-278h] BYREF
  CHAR Filename[272]; // [rsp+C0h] [rbp-238h] BYREF
  CHAR pszPath[272]; // [rsp+1D0h] [rbp-128h] BYREF
  __int64 v22; // [rsp+2E0h] [rbp-18h]

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

MessageBox를 통해 flag를 출력해주고 있다.
flag는 복잡한 연산과정에 의해 설정되므로 저 flag를 어떻게 출력할 수 있는지 확인해봐야겠다.
Str1과 "dreamhack.exe"를 비교하고 이게 맞다면 flag를 출력할 수 있겠다.
Str1은 PathFindFileName(Filename)이다.
Filename은 GetModuleFileNameA(0i64, Filename, 0x104u)이다.
즉 실행된 파일 이름이 dreamhack.exe이어야 한다.

📒 Exploit

📖 dreamhack.c

#include <windows.h>

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

profile
Today I Learned

0개의 댓글