[Reversing.kr] Easy Crack
1번째 문제 Easy Crack 입니다.
문제의 PE파일을 실행시키면 패스워드를 입력받는 다이얼로그가 생성되는데
올바른 패스워드를 찾거나 패스워드 인증 루틴을 수정해주는 것이
문제의 포인트인 거 같네요.
다이얼로그 박스를 만드는 API,
DialogBoxParamA()를 호출하는 함수 0x00401000 부근에 브레이크 포인트를 걸고
실행하면 위와 같은 스택 프레임을 확인할 수 있습니다.
INT_PTR DialogBoxParamA(
HINSTANCE hInstance,
LPCSTR lpTemplateName,
HWND hWndParent,
DLGPROC lpDialogFunc,
LPARAM dwInitParam
);
DialogBoxParamA()의 4번째 인자값에는
다이얼로그 박스에 대한 프로시저의 주소가 있는 것을 보아
0x00401020 프로시저에는 패스워드 인증 루틴이 있다는 것을 예측할 수 있으므로
패스워드 인증 루틴이 있는지 한 번 확인해보도록 하죠.
0x00401020 프로시저에는 패스워드 인증 루틴이 없지만
그 대신 패스워드 인증 루틴을 호출하는 듯한 인스트럭션이 있었습니다.
0x00401080 함수에서 예상했던 데로
패스워드를 검사하고 패스워드가 맞는지 안 맞는지에 따라
다른 내용의 메시지 박스를 출력하는 패스워드 인증 절차를 이루고 있습니다.
패스워드 인증이 성공했을 시에 출력되는 메시지 박스를 확인한다면
성공을 의미하는 문자열 외에 문제에서 요구하는 정답을 찾을 수 없음을 알 수 있고
패스워드 인증 루틴을 수정 또는 무력화하는 방법으로는
문제를 풀이할 수 없음을 의미합니다.
그렇다면 문제에서 요구하는 정답, 즉 올바른 패스워드를 찾아야만 합니다.
GetDlgItemTextA() API를 호출하는
0x004010AA 주소에 브레이크 포인트를 걸고
패스워드 인증 루틴을 확인하기 위한
임시 패스워드 AAAAAAAA를 입력하고 확인 버튼을 눌러보도록 하겠습니다.
GetDlgItemTextA() API를 호출하여 입력된 패스워드 문자열을 가져오고
호출 직후의 주소에 첫 번째 패스워드 인증 루틴이 나오게 됩니다.
입력했던 문자열에 있는 2번째 문자가 'a'(0x61)인지 체크하고
해당하는 문자가 아닐 시 실패를 의미하는 메시지 박스를 호출하는 루틴으로 점프하기에
2번째 문자를 'a'로 세팅하고 다시 입력해보도록 하겠습니다.
두 번째 패스워드 인증 루틴입니다.
strncmp() 함수로 입력된 패스워드 3번째부터 4번째까지의 문자열을
"5y" 문자열과 비교하고 있네요.
패스워드의 2번째 문자부터 4번째 문자열은 "a5y" 임을 알 수 있습니다.
세 번째 패스워드 인증 루틴입니다.
인스트럭션이 많아 어려워 보일 수도 있겠지만
차근차근 해석해보면 strcmp() 함수와 유사하다는 느낌이 느껴집니다.
strcmp() 함수를 호출하여 패스워드의 5번째 문자부터 "R3versing" 문자열과 비교하고 있네요.
strcmp() 함수를 사용한다는 것은
strcmp() 함수로 검사했던 그 이후의 문자열을 검사할 필요가 없다는 뜻으로 해석할 수 있고
나머지 패스워드의 1번째 문자만 확인한다면 패스워드를 완성할 수 있어 보입니다.
나머지 패스워드의 1번째 문자는
네 번째 패스워드 인증 루틴에서 확인할 수 있으며 그 문자는 'E'(0x45) 임을 확인할 수 있습니다.
패스워드의 인증 절차를 다 확인하였기에
패스워드 인증 루틴에서 확인하였던 문자들을 조합해보도록 하죠.
"E" + "a" + "5y" + "R3versing" = "Ea5yR3versing"
Easy Crack의 정답은 Ea5yR3versing 입니다.