CodeEngn Basic RCE L14 Write-Up
파일 링크: https://codeengn.com/challenges/
CodeEngn.com [코드엔진] - Challenges
코드엔진은 국내 리버스엔지니어링 정보공유를 위해 2007년 부터 리버스엔지니어링 컨퍼런스 및 비공개 워크숍을 현업 실무자들과 함께 운영하고 있습니다. 리버스엔지니어링이라는 하나의 큰 주제로 소프트웨어 보안에 대한 다양한 시각과 연구주제에 대한 정보공유를 추구하고 있으며, 상업적 이익 없이 작은 예산으로 운영하고 있어 큰 예산으로 운영하는 다른 컨퍼런스에 비해 여러 가지로 부족 할 수 있습니다.
codeengn.com
풀어보자.
"CodeEngn" 문자열에 해당하는 Serial을 찾아야 한다.
upx로 패킹되어 있다.
간단하게 upx 도구로 언패킹할 수 있고 OEP에서 디버깅 할 수 있다.
code 섹션에서 우클릭 - Search for - All referenced strings 기능을 클릭하면 위와 같이 사용되는 문자열들을 확인할 수 있다. Serial이 틀렸을 때 출력되었던 "You Have ~~" 문자열을 살펴보자.
실패 메시지가 사용되는 루틴을 보면 위와 같다.
strlen 함수가 사용되는 부분에 브레이크 포인트를 설정하고 실행하면 Serial을 입력할 수 있다. Name에 "CodeEngn" 문자열을 입력하면 strlen 함수로 Name의 길이를 반환한다. 그리고 반환된 길이를 반복문의 카운트로 사용한다.
반복문은 간단하기 때문에 따로 쓰지는 않겠다. 게다가 코드엔진에서 Name을 "CodeEngn"으로 고정했기 때문에 결과 값만 알면 된다. 반복문이 끝나면 ESI 레지스터에 0x129A1 값이 저장된다.
그리고 사용자가 입력한 Serial 값을 0x00401383 함수의 인자로 전달한다. 0x00401383 함수를 들어가면 반복문이 나오는데 사용자가 입력한 값을 10진수로 인식하고 16진수로 변환하여 반환해준다.
위와 같이 Name의 계산 결과 0x129A1 값과 Serial을 16진수로 변환한 0x2B67 값을 비교한다. 따라서 Name의 계산 결과 값인 0x129A1을 10진수로 변환하고 Serial로 입력하면 된다.
0x129A1 값을 10진수로 변환하면 76193이다.