문제 설명
- 파일 실행 시 사용자가 입력할 수 있는 창이 출력된다.
- 임의의 값을 입력 시, 부정확한 패스워드라는 문구가 출력된다.
- 출제자가 정해놓은 패스워드를 맞춰보자.
사용 툴
분석
1. 파일정보 확인
확인되는 패킹은 없고, 언어는 C++로 제작되었으며, 32bit라는 정보를 알 수 있다.
2. 분석 내용
처음 attach를 시키면 상단바에 모듈이 ntdll.dll로 되어있는데, easy_crackme.exe로 변경한다. (보기-Modules)
찾는 방법에는 빠르게 문자열참조를 찾는 방법과 위에서부터 호출순서를 확인해 보는 방법이 있는데, 결과적으론 동일하므로 호출을 따라가 본다.
맨 위를 보면 DialogBoxParamA를 호출함을 알 수 있는데 이 함수는 다이얼로그 박스를 만드는 API로 인자는 다음과 같으며,
INT_PTR DialogBoxParamA(
[in, optional] HINSTANCE hInstance,
[in] LPCSTR lpTemplateName,
[in, optional] HWND hWndParent,
[in, optional] DLGPROC lpDialogFunc,
[in] LPARAM dwInitParam
);
브레이크 포인트를 걸고 실행했을 때의 아래의 스택프레임을 확인할 수 있다.
즉, 4번째 인자의 값에 대화 상자 프로시저에 대한 포인터가 있음을 알기 때문에 0x00401020를 먼저 확인해 보자.
0x00401020에는 패스워드 인증 루틴이 없지만, 함수를 호출하는 것을 확인할 수 있는데 이를 따라가 보면,
패스워드를 검증하는 것을 확인할 수 있다.
text 검증하는 듯한 쪽에 break 포인트를 걸고, 임시로 fffffffff를 입력 후 아래처럼 문자가 들어간 곳의 메모리(덤프)를 확인하면
로 두 번째 텍스트가 a임을 알 수 있다.
이후도 동일하게 확인해 보면..
3~4 : 5y
그리고 이후 문자도 쭉 확인하면.. 비밀번호는
E+a+5y+R3versing = Ea5yR3versing 임을 알 수 있다.
링크
http://reversing.kr/challenge.php