BOOL __stdcall DllEntryPoint(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved)
{
if ( fdwReason == 1 )
sub_1800018E0();
return sub_1800015F0(hinstDLL, fdwReason, lpReserved);
}
DLL 엔트리 포인트이다. 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을 호출한다.
__int64 __fastcall sub_180001390(__int64 a1, int a2)
{
if ( a2 == 1 )
sub_1800011A0(a1);
return 1i64;
}
__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이어야 한다.
#include <windows.h>
int main() {
LoadLibrary("prob_rev.dll");
return 0;
}