[CodeEngn] Basic RCE L17
L17
문제
파일 실행
- 한 글자 입력하니 오류 확인
올리디버거
ExeInfoPE
All referenced text strings
- 한 글자 오류 확인하기 위해 해당 문자열 Double Click
- 위 문자열과 밑 문자열 비슷한 패턴
- CALL 17.0043A074 을 통해 EAX에 문자열 갯수 반환하고
- CMP EAX, 3 / CMP EAX, 1E 로 문자열 갯수 비교
- CMP EAX,3 때문에 오류 발생
- 마지막에 CALL 17.0043A0A4로 EAX 값 문자열 갯수로 초기화
- 1로 수정
All referenced text strings
- 분기점으로 이동
분기점
-
JNZ SHORT 17.0045BBC5 찾음
-
CALL 함수에 BP
-
F8 실행하면서 각각 어떤 역할 하는지 확인
- CALL 17.0043A074 : EAX에 문자열 갯수 반환
- CALL 17.0045B850 : 문자열에 따른 KEY 값 변환 알고리즘
- CALL 17.00404C3C : 문자열에 따라 변환된 KEY 값과 입력한 KEY 값 비교후 분기함수에 전달
CALL 17.0045B850 - F7
F8로 진행
- 해당 알고리즘 EDX와 ESI에서 문자열에 따라 변환된 KEY 값의 앞 4자리 값 발견
- 알고리즘을 코드로 변환시켜 Brute Force(무작위 대입)으로
- 문제에서 알려준 BEDA-2F56-BC4F4368-8A71-870B의 앞 4자리
- BEDA 찾기
해당 알고리즘 파이썬으로 변환
- MOVZX ESI, BYTE PTR DS : [EBX+ECX-1] :: ESI = i
- ESI에 문자열의 아스키 값 입력
- 0~9 : 30~39 / A~I : 41~49 / a~I : 61~69
- ADD ESI, EDX :: 값 맞춰주기 위한 것임으로 코드에서 생략
- IMUL ESI, ESI, 772 :: ESI *= 0x772
- MOV EDX, ESI :: EDX = ESI
- IMUL EDX, ESI :: EDX *= ESI
- ADD ESI, EDX :: ESI += EDX
- IMUL ESI, ESI, 474 :: ESI *= 0x474
- ADD ESI, ESI :: ESI += ESI
- MOV EDX,ESI :: EDX에 옮겨담으므로 생략
Python 코드
- 70번 아스키 값 : F
- 정담 : F의 MD5 해쉬 값