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 |