Wargame/CodeEngn Basic RCE

CodeEngn Basic RCE L20 Write-Up

0xe82de_ 2019. 8. 26. 22:31
728x90
728x90
728x90

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

 

CodeEngn.com [코드엔진] - Challenges

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

codeengn.com

[사진 1]

풀어보자.

 

 

[사진 2]

파일을 실행하면 입력할 수도 없다. 코드엔진 문제를 보면 Key파일이 필요하다고 하니 디버거로 파일을 까보자.

 

 

[사진 3]

올리디버거로 파일을 실행하면 CreateFileA 함수와 ReadFile 함수가 보인다. CreateFileA 함수로 "CRACKME3.KEY' 문자열을 제목으로 하는 파일이 존재하는지 확인하고 존재한다면 18bytes 만큼 읽는다. 따라서 CRACKME3.KEY 파일을 만들고 값을 18bytes 입력하면 된다.

 

 

[사진 4]

간단하게 알파벳을 입력했다.

 

 

[사진 5]

다음으로 파일안의 내용을 인자로 전달하는 0x0040131 함수와 0x0040133C 함수가 수행되는데 앞의 함수부터 살펴보자.

 

 

[사진 6]

함수 내부를 보면 반복 루틴이 수행된다. 정리하자면 다음과 같다.

 

1. BL 레지스터에 0x41 값 저장

2. 파일 내용이 저장된 공간의 1byte를 AL 레지스터에 저장

3. AL 레지스터와 BL 레지스터를 XOR 연산하고 AL 레지스터에 저장

4. AL 레지스터의 값을 파일 내용이 저장된 공간에 저장

5. ESI, BL 레지스터 1 증가

6. EAX 레지스터의 값을 메모리 주소 0x4020F9에 더한다.

7. AL 레지스터가 0인지 검사하고 0이라면(파일의 끝이라면) 반복 루틴 종료

8. CL 레지스터 1 증가

9. BL 레지스터의 값과 0x4F 값 비교(BL 레지스터의 값이 0x41부터 시작하므로 최대 15번 수행됨을 알 수 있다.)

10. BL 레지스터의 값이 0x4F이면 반복 루틴을 탈출하고 그렇지 않다면 2~9번 반복

11. ECX 레지스터의 값을 메모리 주소 0x402149에 저장(반복 횟수를 저장하는 것 같다.)

 

요약하자면 파일 내용을 0x41~0x4F 값과 XOR 연산한다. 그리고 연산 값을 메모리 0x4020F9 주소에 더한다.

 

 

[사진 7]

0x00401311 함수가 종료되면 메모리 주소 0x4020F9의 값을 0x12345678 값과 XOR 연산한다.

 

 

[사진 8]

위와 같이 값이 바뀐 것을 확인할 수 있다.

 

 

[사진 9]

0x0040133C 함수를 살펴보면 파일 내용 중 15 번째 문자를 가져온다.

 

 

[사진 10]

위와 같이 "opqr" 문자열의 hex 값을 EAX 레지스터에 저장하고 리턴한다.

 

 

[사진 11]
[사진 12]

그리고 리턴된 EAX 레지스터의 값과 메모리 주소 0x004020F9의 값을 비교하고 다르면 실패한다.

즉, 파일 내용을 14bytes 만큼 읽으면서 만들어지는 메모리 주소 0x004020F9의 값과 15~18 번째 문자열의 hex 값이 같아야 하는 것이다.

 

 

[사진 13]

[사진 12]에서 ZF를 0으로 설정하고 디버깅을 진행하면 위와 같은 명령어들을 볼 수 있다. 코드엔진 문제에서 'Cracked by: CodeEngn!" 문구를 확인할 수 있는데 위 사진에서 "Cracked by: " 문자열 뒤에 나오는 내용을 보면 [사진 6]의 반복 루틴에 의해 파일 내용이 변환된 값들이다.

따라서 파일 내용을 읽고 변환 결과가 "CodeEngn" 문자열이 되면 된다.

 

 

[사진 14]

"CodeEngn" 문자열을 hex 값으로 바꾸면 0x436f6465456e676e 값이다. 이 값을 0x41~48 값과 XOR 연산 후 파일 내용에 입력하면 된다. 그리고 0x49 값을 끝에 입력해주면 0x49 값과 XOR 연산하여 0x0 값이 되고 문자열의 끝이라고 판단할 것이다. 파일 내용 변조는 HxD 도구로 하면 된다.

 

 

[사진 15]

디버거로 파일을 실행하여 메모리 주소 0x4020F9의 값을 비교하는 명령어를 보면 0x1234557B 값과 비교하는 것을 확인할 수 있다. 이 값을 15~18 번째 값에 써주면 된다.

 

 

[사진 16]

위와 같이 HxD 도구로 변조하면 된다.

 

 

[사진 17]

그리고 파일을 실행하면 성공한다.

 

 

Auth Key 값은 [사진 16]의 hex 값을 입력하면 되는데, 중간의 0x6A6B6C6D6E 값을 0x0 값으로 바꿔야 한다. 참고로 이 부분은 아무 값이나 입력해도 성공한다.

728x90
728x90