1. 문제
Key를 구한 후 입력하게 되면 성공메시지를 볼 수 있다
이때 성공메시지 대신 Key 값이 MessageBox에 출력 되도록 하려면 파일을 HexEdit로 오픈 한 다음 0x???? ~ 0x???? 영역에 Key 값을 overwrite 하면 된다.
문제 : Key값과 + 주소영역을 찾으시오
Ex) 7777777????????
Plain Text
복사
요구하는게 많구만. 일단 키를 찾아보자
2. 접근방법
INT_PTR __stdcall DialogFunc(HWND hDlg, UINT a2, WPARAM a3, LPARAM a4)
{
UINT v4; // eax
char *i; // esi
HWND v6; // eax
if ( a2 != 0x111 )
{
if ( a2 == 0x110 )
{
v6 = GetDlgItem(hDlg, 0xBB9);
SetFocus(v6);
}
else if ( a2 == 0x10 )
{
EndDialog(hDlg, 0x10);
}
return 0;
}
if ( HIWORD(a3) )
return 0;
if ( (_WORD)a3 != 1 )
{
if ( (_WORD)a3 == 2 )
{
SendMessageA(hDlg, 0x10u, 0, 0);
}
else if ( (_WORD)a3 == 0xBB8 )
{
DialogBoxParamA(hInstance, (LPCSTR)0x66, hDlg, sub_401126, 0);
}
return 0;
}
v4 = GetDlgItemInt(hDlg, 0xBB9, 0, 0);
for ( i = aOqiqb4ehm4jism; *(_DWORD *)i; i += 4 )
v4 = ((int (*)(void))sub_40110F)();
if ( v4 == 2049480383 )
MessageBoxA(hDlg, Text, Caption, 0x40u);
return 1;
}
C
복사
v4에 담기는 값이 2049480383 이면 된다. 어떻게 하면 v4에 저 값이 담길까 확인해보자. 우선 msgbox에 입력한 값은 GetDlgItemInt 함수에 의해서 가져와진다. 그다음 data 영역에 들어있는 긴 문자열과 어떤 연산을 sub_40110F를 통해 진행한다. 근데 이건 훼이크다.
v4는 결국 입력한 값이 그대로 들어간다.
1000을 입력했고, 그 값인 0x3e8과 2049480383 를 비교한다. 이게 키값이다.
3. 풀이
그다음 키값을 출력하라고 했으니 hxd로 열어서 Congratulation .. 부분을 키값을 바꾸면 된다.
정답 : 20494803830D3B0D45
4. 몰랐던 개념
•
DialogBoxParamA
대화 상자 템플릿 리소스에서 모달 대화 상자를 만든다
INT_PTR DialogBoxParamA(
HINSTANCE hInstance, // 대화 상자 템플릿을 포함하는 모듈에 대한 핸들입니다. 이 매개 변수가 NULL이면 현재 실행 파일이 사용됩니다.
LPCSTR lpTemplateName,
HWND hWndParent, //대화 상자를 소유 한 창에 대한 핸들입니다.
DLGPROC lpDialogFunc, //대화 상자 프로 시저에 대한 포인터입니다. 콜백함수라고 생각하면 됨
LPARAM dwInitParam
);
C
복사
•
GetDlgItemInt
컨트롤의 정수 값을 얻는 함수
UINT GetDlgItemInt(
HWND hDlg, //대화상자의 윈도우 핸들
int nIDDlgItem, //컨트롤의 ID
BOOL *lpTranslated, //에러의 유무
BOOL bSigned //TRUE일 때 부호있는 정수값, FALSE일 때 부호 무시하고 양수값
);
C
복사
•
GetDlgItem
컨트롤의 ID로 컨트롤의 윈도우 핸들을 알아내는 함수
HWND GetDlgItem(
HWND hDlg, //컨트롤의 핸들을 알아낼 대화상자의 핸들
int nIDDlgItem //컨트롤의 ID
);
retrun : 컨트롤의 윈도우 핸들값
C
복사