

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'라는 프로그램을 사용하여 코드 입력과 디버거를 이용하여 실행시켰다.