문제는 다음과 같다.

프로그램을 실행하면 아래와 같이 입력창과 함께 Register now버튼이 보인다.

버튼을 눌러보면 다음과 같이 뜬다.

우선 이 프로그램을 x32dbg로 열어보자.

위와 같이 우리가 알던 EP와는 다른 모습이다.
pushad명령어를 통해서 eax-edi레지스터를 모두 스택에 저장하는 것이 보인다.
이것은 패킹된 프로그램의 특징이다.
PEView로 열어보면 다음과 같이 UPX패킹이 된걸 알 수 있다.

그렇다면 디버깅을 하기 쉽게 언패킹을 해보겠다.
upx의 특징은 pushad를 통해서 eax-edi레지스터의 값을 스택에 저장하고 언패킹 및 디코딩 과정이 끝나면 popad명령어를 통해서 레지스터의 값을 pushad이전의 상태로 복원 시켜 놓는다.
그래서 다음과 같이 패킹을 해제 할 수 있다,
우선 pushad명령어를 실행한다.


레지스터의 값들이 전부 스택에 복사 되었다.
이 상태에서 나중에 popad가 일어나면 저 스택값에 참조가 발생하게 된다.
이를 이용하여 스택주소에 하드웨어 bp를 설치한다.

이후 F9를 눌러 실행하면 popad 이후 명령어에서 멈추게 된다.

여기서 jmp문으로 이동하게 되면

위와 같이 흔히 보던 구조의 EP가 나왔다.
이 상태에서 디버깅을 하기 쉽도록 언패킹된 덤프를 뜨자.
덤프는 x32dbg에 내장된 Syclla를 이용하여 덤프를 떴다.

이제 패킹을 해제 하였으므로 본격적인 디버깅에 들어가면 된다.
문자열 참조로 등록 실패 문자를 검색해봤다. "Wrong.."까지만 치니까 다음과 같은 코드에 도달 할 수 있었다.

바로 보이는 부분이 Congrats! You cracked this CrackMe!라는 문장이다.
저 부분에 어찌저찌 잘 도달 하면 크랙 성공인것 같다.
위쪽으로 더 스크롤 하면 또 다른 문장을 식별 할 수 있다.

No Name entered와 No Serial entered라는 부분이 보인다. 아마도 입력창에 아무것도 입력하지 않았을때 뜨는 부분같다.
이 부분에 분기되는 cmp문을 찾아서 bp를 걸었다.


우선 첫 bp에 내가 Name창에 입력한 Hello가 적혀있다.

두번째 bp에서 내가 입력한 시리얼값 12345를 가져왔다.
이어서 실행을 하다 보면 위와 같은 분기문을 마주한다.

call 403b2c에 매개변수로 "Hello"와 "Registered User"라는 문자열을 넘기고 jne즉, ZF가 0이면 분기한다.
아마도 403b2c가 문자열 비교 함수 인것으로 예상된다. 그러므로 Name의 값은 Registered User가 들어가야 한다고 예측 할 수 있다. Name 값을 수정해서 디버깅을 시도했다.

예상했던대로 분기문이 실행되지 않았다.
이어서 실행을 하다보면 오류를 발생시키는 두번째 분기문을 확인할 수 있다.

이 곳도 마찬가지로 이전에 문자열 비교함수라고 했던 403b2c를 호출후 jne로 등록 실패 여부를 판단한다.
그럼 이로써 시리얼 값은 GFX-754-IER-954임을 유추 할 수 있다.
이 값들을 종합해서 입력해보자.

역시나 정답이었다.
따라서 문제였던 등록키는 GFX-754-IER-954가 정답이다.
이 문제는 좀 복잡했으니 요약을 해보자.
우선 패킹이 되어있었으므로 하드웨어 bp를 이용해 popad까지 도달후 언패킹을 진행하였다.
이후 덤프를 떠서 디버깅이 쉽게 하였다. (덤프를 안뜨고 진행하면 실수로 프로그램을 꺼먹으면 언패킹부터 다시 해야한다,,)
이후 문자열 참조로 값을 비교하는 분기문을 찾아서 그에 맞는 값을 입력해주면 성공이었다.
이 문제는 패킹된 프로그램을 언패킹하고 해결할 수 있는가를 확인하기 위한 문제인것 같다.