CodeEngn basic 14
코드엔진 basic 14번 문제풀이
일단 프로그램을 먼저 실행해보면 name을 입력하는 칸과 name에 관련된 시리얼 키값을 입력하는 윈도우 창이 나타나고 name과 키값이 일치하지 않으면 틀린 시리얼 키값 이라는 메시지 창이 나타난다.
이제 프로그램을 분석하기전에 PEid를 사용하여 패킹이 되었는지 확인해보니 upx로 패킹 된 프로그램인 것을 확인할 수 있었다.
패킹된 것을 확인하였으므로 upx를 사용하여 언패킹 시켜준 뒤 올리 디버거로 프로그램을 열어 본 뒤 프로그램을 계속 실행해 보면 EP인 401000주소를 확인할 수 있고 코드를 밑으로 내려보면 성공 메시지와 틀렸을 때 나오는 메시지 박스 2개가 보이고 코드를 살펴보면 성공 메시지박스 위에 eax와 esi를 비교하여 점프하는 비교문이 보인다.
0040133A에 있는 비교문을 살펴보면 위에 CALL 00401383에서 반환 값 eax를 받고 스택에 있는 esi를 가져와 비교하여 같으면 성공 메시지를 띄우고 다르면 실패 메시지를 띄우는 것을 알 수 있다. Eax 값은 위의 함수의 반환 값을 알지만 esi의 값은 아직 자세히 모르겠으므로 확인해 보면 위에서 창에 잆력한 name 값을 가지고 값을 변환 시켜 esi에 저장한 후 스택에 push 하는 것을 볼 수 있었다.
이제 올리디버거로 프로그램을 실행시켜 어떠한 값들이 들어가는지 확인해 보면 CodeEngn이라는 값을 넣으면 이 값이 변환되어 esi에 129A1이라는 값으로 저장되는 것을 볼 수 있었다. 이제 esi값을 확인하였으니 비교문으로 돌아가서 다시 확인해보면 esi값인 129A1값과 입력한 시리얼 값을 변환시켜 반환한 eax값을 비교하는 것을 알 수 있으므로 내가 입력한 시리얼 값이 129A1이 되어야 함을 알 수 있다.
이부분에서 엄청 삽질도 많이 하고 다 찾아 놓고 생각을 이상하게 해서 답을 찾는데 오래 걸린 것 같다. 복호화 코드를 만들어 봤지만 잘 동작하지 않았고 이게 아닌가 생각하면서 여러 가지를 시도하던 중에 다시 프로그램을 실행하여 값을 1부터 10까지 하나씩 입력하여 eax값에 어떠한 값이 반환되는지 실행해보니 1~9까지는 그대로 값이 나오고 10부터는 A로 표기되는 것을 봐서 10진수 정수 값으로 입력 받고 그 값을 16진수로 변환하는 것을 알 수 있었다. 그러니 129A1을 10진수로 변환한 79193이 시리얼 값임을 알 수 있다.