CodeEngn Basic RCE L20 Write-Up
파일 링크: https://codeengn.com/challenges/
CodeEngn.com [코드엔진] - Challenges
코드엔진은 국내 리버스엔지니어링 정보공유를 위해 2007년 부터 리버스엔지니어링 컨퍼런스 및 비공개 워크숍을 현업 실무자들과 함께 운영하고 있습니다. 리버스엔지니어링이라는 하나의 큰 주제로 소프트웨어 보안에 대한 다양한 시각과 연구주제에 대한 정보공유를 추구하고 있으며, 상업적 이익 없이 작은 예산으로 운영하고 있어 큰 예산으로 운영하는 다른 컨퍼런스에 비해 여러 가지로 부족 할 수 있습니다.
codeengn.com
풀어보자.
파일을 실행하면 입력할 수도 없다. 코드엔진 문제를 보면 Key파일이 필요하다고 하니 디버거로 파일을 까보자.
올리디버거로 파일을 실행하면 CreateFileA 함수와 ReadFile 함수가 보인다. CreateFileA 함수로 "CRACKME3.KEY' 문자열을 제목으로 하는 파일이 존재하는지 확인하고 존재한다면 18bytes 만큼 읽는다. 따라서 CRACKME3.KEY 파일을 만들고 값을 18bytes 입력하면 된다.
간단하게 알파벳을 입력했다.
다음으로 파일안의 내용을 인자로 전달하는 0x0040131 함수와 0x0040133C 함수가 수행되는데 앞의 함수부터 살펴보자.
함수 내부를 보면 반복 루틴이 수행된다. 정리하자면 다음과 같다.
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 주소에 더한다.
0x00401311 함수가 종료되면 메모리 주소 0x4020F9의 값을 0x12345678 값과 XOR 연산한다.
위와 같이 값이 바뀐 것을 확인할 수 있다.
0x0040133C 함수를 살펴보면 파일 내용 중 15 번째 문자를 가져온다.
위와 같이 "opqr" 문자열의 hex 값을 EAX 레지스터에 저장하고 리턴한다.
그리고 리턴된 EAX 레지스터의 값과 메모리 주소 0x004020F9의 값을 비교하고 다르면 실패한다.
즉, 파일 내용을 14bytes 만큼 읽으면서 만들어지는 메모리 주소 0x004020F9의 값과 15~18 번째 문자열의 hex 값이 같아야 하는 것이다.
[사진 12]에서 ZF를 0으로 설정하고 디버깅을 진행하면 위와 같은 명령어들을 볼 수 있다. 코드엔진 문제에서 'Cracked by: CodeEngn!" 문구를 확인할 수 있는데 위 사진에서 "Cracked by: " 문자열 뒤에 나오는 내용을 보면 [사진 6]의 반복 루틴에 의해 파일 내용이 변환된 값들이다.
따라서 파일 내용을 읽고 변환 결과가 "CodeEngn" 문자열이 되면 된다.
"CodeEngn" 문자열을 hex 값으로 바꾸면 0x436f6465456e676e 값이다. 이 값을 0x41~48 값과 XOR 연산 후 파일 내용에 입력하면 된다. 그리고 0x49 값을 끝에 입력해주면 0x49 값과 XOR 연산하여 0x0 값이 되고 문자열의 끝이라고 판단할 것이다. 파일 내용 변조는 HxD 도구로 하면 된다.
디버거로 파일을 실행하여 메모리 주소 0x4020F9의 값을 비교하는 명령어를 보면 0x1234557B 값과 비교하는 것을 확인할 수 있다. 이 값을 15~18 번째 값에 써주면 된다.
위와 같이 HxD 도구로 변조하면 된다.
그리고 파일을 실행하면 성공한다.
Auth Key 값은 [사진 16]의 hex 값을 입력하면 되는데, 중간의 0x6A6B6C6D6E 값을 0x0 값으로 바꿔야 한다. 참고로 이 부분은 아무 값이나 입력해도 성공한다.