Name에 따라 Serial 이 바뀌는 문제입니다. 우선 간단한 정보를 얻기 위해 PEiD를 이용하겠습니다.
UPX로 패킹된 것을 볼 수 있습니다. Ollydbg를 통해 언팩을 하겠습니다. UPX 언팩은 언제나 간단합니다.
우선 코드를 조금 내려 POPAD아래의 JMP를 찾습니다.(OEP)
해당 부분에 브레이크 포인트를 걸고 실행시켜 OEP로 넘어가기 전에서 멈춘 후 OEP로 이동합니다.
Plugins -> OllyDump(플러그인입니다. 없으면 받으셔야 해요) -> Dump debugged process 를 차례대로 클릭합니다.
아래 Rebuild Import 에 체크를 해제하신 후 Dump를 클릭하면 됩니다.
완벽하게 복구가 되지 않았기 때문에 실행하면 오류가 발생합니다. LordPE 툴을 이용하여 복구를 한 후 실행하면 정상적으로 실행이 됩니다.
이제 본격적으로 문제 풀이를 하겠습니다.
시작은 역시 문자열 검색입니다. ㅎ CODE 창에서 마우스 우클릭 -> Search for -> All referenced text strings
애석하게도 우리에게 쉽사리 문자열을 제공하진 않습니다.
그래도 방법은 언제나 존재합니다. 저는 Key가 틀렸을 때 나오는 문자열을 검색하겠습니다.
CODE창 -> 마우스 우클릭 -> Search for -> Binary string 을 클릭하거나 Ctrl + B 를 누릅니다.
그 다음 틀린 경우 메시지 창에 뜬 문자열을 검색합니다.
그럼 특정 위치로 이동을 하게 되는데 dump 창에서 이 부분의 주소로 이동을 하면 해당 문자열들이 보입니다.
이제 다시 저 주소를 다시 CODE 창에서 검색을 해야 합니다. 단, 문자열이 스페이스바(20)으로 시작하기 때문에 검색해야하는 주소는 403486 입니다. 입력할 때는 리틀엔디안 방식이기 때문에 거꾸로 입력해주셔야 합니다.
검색하는 방법은 위의 Binary string 과 같습니다. 아래와 같이 입력해주세요.
위에서 본 문자열을 찾을 수 있습니다. 이제 위로 올라가서 조건분기점을 찾고 시리얼키를 찾으면 됩니다.
제가 생각하기에 중요한 부분은 아래 브레이크 포인트를 걸어놓은 부분입니다.
이 상태에서 실행하여 Name에 CodeEngn을 key에 임의의 값(숫자라고 해서 저는 12345를 입력)을 입력합니다.
입력한 키값이 어떤 함수의 인자로 쓰인 후 그에 대한 반환값은 EAX에 저장되므로, ESI는 CodeEngn에 대한 값을 저장하는 것을 유추할 수 있습니다. 입력받은 값이 함수에 의해 처리된 후 스택에 올라간 ESI와 값을 비교하여 올바른지 아닌지를 판별하므로 일단 EAX값이 어떻게 변하는 지 확인해보겠습니다.
함수부분 까지 실행합니다.(2번째 브레이크포인트 실행) 아래는 위 코드 실행에 따른 레지스트리 결과입니다.
우리에게 필요한 값은 EAX와 ESI이므로 10진수로 어떤 값인지 계산기를 통해 확인해보겠습니다. 먼저 EAX입니다.
우리가 입력했던 숫자가 그대로 나옵니다. 이를 통해 호출된 함수는 문자형 숫자를 정수형으로 변환시켜준다는 것을 알 수 있습니다. 이 값과 ESI가 같으면 되므로 ESI의 10진수가 시리얼키이자 정답임을 알 수 있습니다. 아래는 ESI의 10진수입니다.