readme.txt를 읽어보면 시리얼값이 76876-77776일때의 password를 구하라고 한다. 그리고 password의 마지막 값은 'p'이다.



실행해보니 Wrong이라고 나와서 Wrong을 출력해주는 부분을 찾아가 보았다. 시리얼값의 포맷은 xxxxx-xxxxx이다.




sub_401740 함수의 리턴값이 1이면 Correct를 띄워줘서 sub_401740 함수를 분석해 보았다.




제일 처음에 필터링 하는 부분은 password값이다. 4글자여야 하고 알파벳 소문자여야 한다.


그리고 본격적으로 password값을 연산해  시리얼값을 만들어낸다.


먼저 생소한 함수를 찾아보았다.


GetAt(char* a1, int a2) : 문자열 a1의 a2번째 인덱스의 값을 반환해 준다.

 

먼저 if문으로 값을 검증하는 루틴 10개가 있다. 시리얼 값도 '-'를 제외하면 10자리 이므로 이부분에서 시리얼 값을 만들고 비교한다는것을 알았다.


v61은 password이므로 한자리씩 갖고와서 shift연산, and연산등을 통해서 내가 입력한 시리얼 값과 비교를 한다.


예를들어 if(v13==v12) 이부분은 v12는 내가 입력한 시리얼값의 첫번째 인덱스, v13은 password를 연산해 나온 시리얼 값의 첫번째 인덱스이다.


이런식으로 10자리가 전부 맞아야 1을 반환해준다.


password : xxxx

serial :xxxxx-xxxxx


크게보면 password값 1,2,번째 값을 통해 시리얼값 '-' 앞부분 5자리를 만들어내고 password값 4,5번째 값을 통해 시리얼값 '-' 뒷부분 5자리를 만들어 낸다.


연산하는 부분을 참고해 코드를 짜보았다.






어떤 사람이 bruteforce 해주는 툴을 만들었다.


아직 핸들, 윈도우메시지등 win32 api는 생소하니 좀더 공부해본후 내가 직접 만들어야 할거같다.



#include <iostream>
#include <Windows.h>
using namespace std;
void bruteForce(HWND hwndName, HWND hwndOutput)
{
   wchar_t inputName[5] = L"xxxp";
   wchar_t output[10];
   cout << "Correct Names:" << endl;
   for (int i = 0x61; i < 0x7B; i++)
      for (int j = 0x61; j < 0x7B; j++)
         for (int k = 0x61; k < 0x7B; k++)
         {
            inputName[0] = i;
            inputName[1] = j;
            inputName[2] = k;
            SendMessage(hwndName, WM_SETTEXT, 0, (LPARAM)inputName);
            SendMessage(hwndOutput, WM_GETTEXT, 10, (LPARAM)output);
            if ((char)output[0] != 'W')
               wcout << inputName << endl;
         }
}
int main() {
   cout << "##############################################"<< endl << endl;
   cout << "[Reversing.kr] Position Bruteforcer" << endl;
   cout << "by 거북찡 http://blog.naver.com/7005ye" << endl << endl;
   cout << "##############################################" << endl << endl;
   HWND hwnd;
   wchar_t serial[12] = L"76876-77776";
   if ((hwnd = FindWindow(NULL, L"Position")) != NULL)
   {
      HWND hwndName = FindWindowEx(hwnd, NULL, L"EDIT", NULL);
      HWND hwndSerial = FindWindowEx(hwnd, hwndName, L"EDIT", NULL);
      HWND hwndOutput = FindWindowEx(hwnd, NULL, L"STATIC", NULL);
      SendMessage(hwndSerial, WM_SETTEXT, 0, (LPARAM)serial);
      cout << "Bruteforcing for serial# "; wcout << serial << endl;
      bruteForce(hwndName, hwndOutput);
   }
   else
      cout << "Position 캡션 감지 실패. 프로그램을 종료합니다" << endl;
   system("PAUSE");
   return 0;
}

출처 : http://blog.naver.com/7005ye/220690081917


'문제 > Reversing.kr' 카테고리의 다른 글

Reversing.kr Ransomware  (0) 2017.01.21
Reversing.kr x64 Lotto  (0) 2016.10.06
Reversing.kr HateIntel  (0) 2016.10.05
Reversing.kr Music Player  (0) 2016.10.04
Reversing.kr Direct3D FPS  (0) 2016.09.01

+ Recent posts