CodeEngn Basic 17
문제: Key 값이 BEDA-2F56-BC4F4368-8A71-870B 일 때 Name은 무엇인가 힌트 : Name은 한자리인데.. 알파벳일수도 있고 숫자일수도 있고.. 정답인증은 Name의 MD5 해쉬값(대문자)
그냥 brute force하면 풀리긴 하지만 일단 분석을 해봤다. String Reference를 통해 진행되는 코드부분을 확인해서 브레이크포인트를 걸고 시작했다.
Name값엔 9를를 임의로 입력하고 실행해서 진행하다 보면 그림 13 처럼 Name값을 3글자이상 제한하는 분기점과 최대 1E = 30글자 미만으로 제한하는 부분이 보인다.
문제에서 Name값은 한자리라고 했기 때문에, 3자리 이상으로 설정한 부분을 1로 수정했다. 일단 여러 함수를 진행하면 0045BBA0에서 MOV한 EDX값이 9의 코드다. 그래서 0045BB9B함수로 들어가서 코드가 어떻게 생성되는지 확인해봤다.
진행하면 그림 16처럼 EDX에 키값의 앞부분인 C542가 보인다. 그 밑으로도 이런 식으로 키값을 생성하는 연산이 3번 더 나오지만, 앞부분만 확인해도 답을 판단 할 수 있을 꺼라 생각하고 C542가 어떻게 만들어 졌는지 확인하면 문제가 해결될 것 같다.
다시 처음부터 실행해서 연산을 보면 결국 EDX의 값은 ESI값에의해 결정되는데, ESI는 45B8A0에서 9(39)를 입력받고 ESI에 EDX(0)를 더한뒤, 772곱하기ESI 그리고 그값을 EDX에 복사한다. 그리고 ESI를 EDX에 곱하고 그 값을 다시 ESI에 더한다. 그후 다시 474를 곱하고 그후 자기자신을 더한다. 그리고 그 값을 EDX에 보낸다. 그러면 앞4비트가 키의 앞자리가 된다. 정리하면,
- ESI에 772를 곱한다.
- ESI의 제곱값을 EDX에 넣는다.
- ESI에 EDX를 곱한다.
- ESI에 474를 곱한다
- ESI+ESI를한다.
문제 키값인 BEDA-2F56-BC4F4368-8A71-870B 의 앞부분인 BEDA를 찾으면 된다. 뒷부분도 찾을 수는 있지만 굳이 찾을 필요는 없어서 생략했다. 45B8A0에서 받는 값이, 0~9는 30~39/ A~I는 41~49 / a~I는 61~69다. 아스키 코드값 같다 하나하나 17번 파일로 확인하면 오래 걸리기 때문에 위에 ESI와 EDX를 기준으로 연산하는 코드를 자바로 짜서 0x30~0x7A(0~z)까지 돌려봤다.
답은 70 16진수 46이다. 아스키코드 표를 찾아보니 영어 “F”다. 글자수를 수정한 17번 파일로 실행해서 확인해보니 맞다.
끝으로 R의 MD5 해쉬값은 ”e1e1d3d40573127e9ee0480caf1283d6” 다