Wargame/CodeEngn Basic RCE

CodeEngn Basic RCE L14 Write-Up

0xe82de_ 2019. 8. 20. 22:46
728x90
728x90
728x90

파일 링크: https://codeengn.com/challenges/

 

CodeEngn.com [코드엔진] - Challenges

코드엔진은 국내 리버스엔지니어링 정보공유를 위해 2007년 부터 리버스엔지니어링 컨퍼런스 및 비공개 워크숍을 현업 실무자들과 함께 운영하고 있습니다. 리버스엔지니어링이라는 하나의 큰 주제로 소프트웨어 보안에 대한 다양한 시각과 연구주제에 대한 정보공유를 추구하고 있으며, 상업적 이익 없이 작은 예산으로 운영하고 있어 큰 예산으로 운영하는 다른 컨퍼런스에 비해 여러 가지로 부족 할 수 있습니다.

codeengn.com

[사진 1]

풀어보자.

 

 

[사진 2]

"CodeEngn" 문자열에 해당하는 Serial을 찾아야 한다.

 

 

[사진 3]

upx로 패킹되어 있다.

 

 

[사진 4]
[사진 5]

간단하게 upx 도구로 언패킹할 수 있고 OEP에서 디버깅 할 수 있다.

 

 

[사진 6]

code 섹션에서 우클릭 - Search for - All referenced strings 기능을 클릭하면 위와 같이 사용되는 문자열들을 확인할 수 있다. Serial이 틀렸을 때 출력되었던 "You Have ~~" 문자열을 살펴보자.

 

 

[사진 7]

실패 메시지가 사용되는 루틴을 보면 위와 같다.

 

 

[사진 8]

strlen 함수가 사용되는 부분에 브레이크 포인트를 설정하고 실행하면 Serial을 입력할 수 있다. Name에 "CodeEngn" 문자열을 입력하면 strlen 함수로 Name의 길이를 반환한다. 그리고 반환된 길이를 반복문의 카운트로 사용한다.

 

 

[사진 9]

반복문은 간단하기 때문에 따로 쓰지는 않겠다. 게다가 코드엔진에서 Name을 "CodeEngn"으로 고정했기 때문에 결과 값만 알면 된다. 반복문이 끝나면 ESI 레지스터에 0x129A1 값이 저장된다.

 

 

[사진 10]

그리고 사용자가 입력한 Serial 값을 0x00401383 함수의 인자로 전달한다. 0x00401383 함수를 들어가면 반복문이 나오는데 사용자가 입력한 값을 10진수로 인식하고 16진수로 변환하여 반환해준다.

 

 

[사진 11]

위와 같이 Name의 계산 결과 0x129A1 값과 Serial을 16진수로 변환한 0x2B67 값을 비교한다. 따라서 Name의 계산 결과 값인 0x129A1을 10진수로 변환하고 Serial로 입력하면 된다.

 

 

[사진 12]

0x129A1 값을 10진수로 변환하면 76193이다.

728x90
728x90