본문 바로가기

Reversing/CodeEngn

[CodeEngn] Advance RCE L03풀이

https://ch.codeengn.com/

 

CodeEngn.com [코드엔진]

코드엔진은 국내 리버스엔지니어링 정보공유를 위해 2007년 부터 리버스엔지니어링 컨퍼런스 및 세미나, 워크숍을 현업 실무자들과 함께 운영하고 있는 비영리 커뮤니티입니다.

ch.codeengn.com


그림 1
그림 2

문제는 Name이 CodeEngn 일 때의 Serial을 구하는 것이다.

 

파일을 다운로드 받아서 실행시켜보니 Name과 Serial을 입력하는 칸이 있고,

Name에 CodenEngn, Serial에 아무 값이나 입력했더니 옳은 답이 아니라고 한다.

그림 3

디버거로 분석하기 전에 Exeinfo로 확인해보았다.

패킹은 되어있지 않은 상태인데 RES/OVL : 99 / 0% 이런 문구를 처음 봐서 찾아보니 EXE에서 리소스 영역이 차지하는 퍼센트, 즉 리소스 섹션의 비율을 의미한다고 한다. 중요한 부분은 아닌 것 같다.

X32 디버거로 열어보았다.

일단 문자열 찾기를 통해 확인해보니 성공 FLAG 같은 부분이 있어서 해당 부분으로 이동해보았다.

그림 4

 

해당 부분으로 이동해보니 성공 FLAG가 맞는데 MAIN 함수는 아니었고 호출되는 방식으로 동작하는 것 같아 보였다.

그림 5

일단 전체적인 흐름을 보기 위해 실행을 시켜서 Name에 CodeEngn을 입력하고 Serial에는 랜덤 값을 입력해보았다.

 

그림 6

위의 그림을 보면

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에 저장하는 연산을 하고 있다.

 

그림 7

그리고 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