이번에는 거꾸로 Name을 구하는 문제입니다. 실행한 화면은 다음과 같습니다.
Name을 한 개만 입력하니까 더 입력하라고 하는 군요. 올리디버거를 통해 자세하게 살펴보겠습니다.
우선 입력받는 문자 수를 확인해야하므로 Please Enter More Chars… 부분으로 이동하겠습니다.
(코드창 -> 마우스 우클릭 -> Search for -> All referenced text strings)
해당 위치의 코드입니다. 바로 위에 비교문과 분기점을 볼 수 있습니다. JGE(Jump if Greater than or Equal) 명령어는 >= 즉, 크거나 같을 경우 분기입니다. 이 명령어의 사용으로 바로 위에 있는 3이 입력하는 최소 문자길이 인 듯 합니다. 이를 1로 바꿔 문제 풀이가 가능하도록 수정하겠습니다.
수정은 해당 코드를 더블 클릭하시면 가능합니다. 수정하신 후 상태를 유지하려면 UPX 언패킹할 때 처럼 덤프 파일을 생성하면 됩니다.
Rebuild Import 체크 해제하는 걸 잊지 말아주세요.
코드만 수정했기 때문에 따로 복구하실 필요 없이 바로 실행이 됩니다. 이젠 문자를 더 입력하라는 메시지는 뜨지 않습니다.
이젠 Name을 구하겠습니다. 처음에 Please Enter More Chars… 를 찾은 방법으로 성공했을 때의 문자열을 찾아 해당 위치로 이동합니다. 이동하면 함수호출과 분기점을 볼 수 있습니다.
프로그램을 실행하면 함수 호출 전에 이미 시리얼이 생성되어 있습니다. 이번에 찾은 함수는 그냥 값을 비교하여 참인지 거짓인지 판단하는 듯하므로 시리얼을 생성하는 부분을 다시 찾아야 합니다.
시리얼을 생성하는 함수는 전에 찾은 함수 바로 위에 있는 함수입니다. 저 함수를 지나가니 시리얼이 생성되더군요 ㅎ
해당 함수를 분석해서 시리얼을 풀어내는 코드를 만들 수도 있지만 어차피 정답이 한 글자인 거 일일이 대입해서 풀었습니다.(생각보다 금방 끝납니다.)
MD5는 128bit 해쉬함수입니다. 보통 프로그램의 무결성 검사에 많이 쓰입니다.
http://md5.rednoize.com/ 이 사이트에서 값을 구할 수 있습니다.