문제는 Name이 CodeEngn 일 때의 Serial을 구하는 것이다.
파일을 다운로드 받아서 실행시켜보니 Name과 Serial을 입력하는 칸이 있고,
Name에 CodenEngn, Serial에 아무 값이나 입력했더니 옳은 답이 아니라고 한다.
디버거로 분석하기 전에 Exeinfo로 확인해보았다.
패킹은 되어있지 않은 상태인데 RES/OVL : 99 / 0% 이런 문구를 처음 봐서 찾아보니 EXE에서 리소스 영역이 차지하는 퍼센트, 즉 리소스 섹션의 비율을 의미한다고 한다. 중요한 부분은 아닌 것 같다.
X32 디버거로 열어보았다.
일단 문자열 찾기를 통해 확인해보니 성공 FLAG 같은 부분이 있어서 해당 부분으로 이동해보았다.
해당 부분으로 이동해보니 성공 FLAG가 맞는데 MAIN 함수는 아니었고 호출되는 방식으로 동작하는 것 같아 보였다.
일단 전체적인 흐름을 보기 위해 실행을 시켜서 Name에 CodeEngn을 입력하고 Serial에는 랜덤 값을 입력해보았다.
위의 그림을 보면
403238에 Name으로 입력한 CodeEngn이라는 문자열이 담기고, 403264에 Serial으로 입력한 123456789라는 값이 담기는 것을 볼 수 있다.
그리고 아래의 빨간 박스를 보면 내가 입력한 serial 값과 403284에 담긴 3265754874라는 값을 strcmp를 통해 비교하고 있다.
여기에서 비교를 하고 있는 3265754874 라는 값이 CodeEngn에 해당하는 serial 값임을 알 수 있다.
문제에서 CodeEngn에 해당하는 serial 값을 구하라고 했으므로 답은 3265754874가 된다.
[ Serial : 3265754874 ]
<잠깐!>
문제를 보다가 실행해보니 serial 값이 틀리면 idiv eax에서 더 넘어가는데
Serial 값이 맞으면 idiv 부분에서 EXCEPTION_INT_DIVIDE_BY_ZERO 오류가 발생하였다.
둘 다 처음 보는 명령어와 오류라서 찾아보았다.
IDIV는 나눗셈인데 부호가 있는 수의 나눗셈이라고 한다.
동작 방식은 EDX 레지스터를 최상위 비트로, EAX 레지스터를 최하위 비트로 설정하여 EDX(4BYTE)+EAX(4BYTE) 형태로 이어 붙인 정수형 데이터를 인자 값의 데이터로 나누는 연산을 한다고 한다. 그리고 그 몫은 EAX에, 나머지는 EDX에 저장한다.
즉, 여기서는 EDX+EAX를 EAX로 나눈 후 그 몫을 EAX에 저장하고 나머지는 EDX에 저장하는 연산을 하고 있다.
그리고 EXCEPTION_INT_DIVIDE_BY_ZERO는 예외에 의한 에러 검출 및 디버깅 오류로, 0에 의한 나눗셈으로 인한 오류라고 한다. 정수형 데이터에 대하여 0으로 나눔으로써 발생하는 예외라고 한다.
위의 serial 값이 다르던 같던 strcmp를 거치고 eax에 0이 담기는데 왜 serial이 같으면 오류가 나고 다르면 계속 진행이 될까,,,
이건 찾아봐도 모르겠다,,,
'Reversing > CodeEngn' 카테고리의 다른 글
[CodeEngn] Advance RCE L05풀이 (0) | 2021.11.13 |
---|---|
[CodeEngn] Advance RCE L04풀이 (0) | 2021.10.05 |
[CodeEngn] Advance RCE L02풀이 (0) | 2021.10.05 |
[CodeEngn] Advance RCE L01풀이 (0) | 2021.10.05 |
[CodeEngn] Basic RCE L20풀이 (0) | 2021.09.13 |