문제분석 & 풀이
DLL 파일을 분석해보자.
○ start()
int __cdecl start(LPVOID lpParameter)
{
wchar_t *v1; // eax
WCHAR Filename[256]; // [esp+4h] [ebp-204h] BYREF
if ( GetModuleFileNameW(0, Filename, 0x200u) )
{
v1 = wcsrchr(Filename, 0x5Cu);
if ( v1 )
{
if ( !wcsicmp(v1 + 1, L"notepad.exe") )
{
dword_70A833A8 = (int)CreateThread(0, 0, (LPTHREAD_START_ROUTINE)StartAddress, lpParameter, 0, 0);
CloseHandle((HANDLE)dword_70A833A8);
}
}
}
return 1;
}
실행 중인 프로세스가 "notepad.exe"인지 확인하고 startAddress()를 쓰레드로 실행한다.
○ StartAddress()
void __stdcall __noreturn StartAddress(LPVOID lpThreadParameter)
{
HWND WindowW; // esi
HWND Window; // ebx
DWORD CurrentProcessId; // edi
DWORD dwProcessId; // [esp+14h] [ebp-28h] BYREF
CHAR String[32]; // [esp+18h] [ebp-24h] BYREF
sub_70A810C0();
Sleep(0x2BCu);
WindowW = FindWindowW(0, WindowName);
Window = FindWindowExW(WindowW, 0, L"edit", 0);
CurrentProcessId = GetCurrentProcessId();
GetWindowThreadProcessId(WindowW, &dwProcessId);
if ( CurrentProcessId != dwProcessId )
FreeLibraryAndExitThread((HMODULE)lpThreadParameter, 0);
do
{
Sleep(0x32u);
GetWindowTextA(Window, String, 32);
}
while ( strcmp(String, (const char *)&dword_70A83388) );
SetWindowTextA(Window, ::String);
FreeLibraryAndExitThread((HMODULE)lpThreadParameter, 0);
}
sub_70A810C0()를 실행하고 마지막에 strcmp()로 String 변수와 dword_70A83388을 비교한다. String과 dword_70A83388가 일치하는 것이 목적이다.
String과 dword_70A83388는 동적으로 데이터가 할당된다.
즉, sub_70A810C0() 내부에서 String과 dword_70A83388을 생성한다고 추측할 수 있다.
○ sub_70A810C0()
[그림]을 보면 "시스템 시간"과 관련된 키워드 함수가 등장한다.
localtime()으로 생성한 Time으로 v4를 생성한다. 이후 dword_70A83388에 v4를 저장한다.
아래쪽을 분석하면 비슷한 작업을 거친 후, String 변수에 v10을 저장한다.
예상대로 sub_70A810C0()가 String과 dword_70A83388을 생성하는 함수가 맞는 것 같다.
String에 저장되는 값을 빠르게 알아내기위해 동적분석을 진행했다.
○ 동적분석
setWindowTextA()에 브레이크 포인트 설정(F2)
[F9] 동적 디버깅 시작
최초 실행하면 자동으로 디버거 선택창이 뜨는데 [그림]에 표시한 것 중 하나 선택 (필자는 windbg)
DLL 파일이라 애플리케이션 세팅관련해서 에러가 발생하는데 다시 세팅해서 진행하자.
application을 "notepad.exe"로 변경하고 [OK] 클릭
정상적으로 동적디버깅이 된다.
String 전역 변수의 값을 확인할 것이므로 break 모드로 변경하기 위해 [suspend] 클릭
디버깅 프로세스가 종료되지 않도록 [No] 선택
String 전역변수를 확인하기위해 클릭
[그림]과 같이 실시간 String 전역변수의 데이터를 확인할 수 있다.
db [addr]
Output 창에서 windbg 명령어를 입력해서 String 전역변수 주소의 데이터 확인하면 [그림]과 같다.
flag가 아니여서 순간 당황했지만
웹 사이트 폼에 인증하면?