Iriton's log
[CodeEngn] Basic RCE - L15 본문
Name이 CodeEngn일때 Serial을 구하시오.
필요 개념 정리
- Ollydbg 메뉴더블 클릭: 해당 주소로 이동
- Az 아이콘: 현재 보고 있는 모듈에 있는 문자열들을 참조하는 어셈블리어를 검색해줌.
- CMP: 두 값을 비교한다.
- 두 값이 같다면 ZF가 1로, 다르면 0으로 설정됨.
- JNZ: JNZ A - 비교 값이 0이 아닌 경우 A로 이동, 0인 경우 점프하지 않고 다음 코드 실행.
- 비교된 값이 있어야 하므로 앞에 CMP가 먼저 실행되어야 함.
- EAX: 산술, 논리 연산을 수행. 함수의 반환값이 이 레지스터에 저장.
- 호출 함수의 성공 또는 실패 여부를 쉽게 파악할 수 있으며 반환값을 쉽게 얻어올 수 있음.
- 리틀 엔디언: 데이터 저장을 위해 메모리에 바이트를 저장하는데, 이 바이트를 저장하는 배열 순서가 엔디언. 리틀 엔디언은 이를 역순으로 저장.:빅엔디언 - 12 34 /// 리들엔디언 - 34 12
- ex) 0x1234 :빅엔디언 - 12 34 /// 리들엔디언 - 34 12
풀이
프로그램을 실행시켜서 임의로 시리얼 값을 입력했더니 Try Again 이라는 문구가 뜬다.
디버거로 열어서 해당 문자를 찾아보았다.
마우스 우클릭 후 Search for - All referenced text strings 를 선택하면 코드에 참조되는 문자열을 확인할 수 있다.
이렇게 Try again 이라는 문자열을 찾기 쉬워진다.
더블 클릭하면 해당 코드로 이동된다.
JNZ 명령이 참이 되면 성공했을 때 뜨는 것으로 추정되는 문자가 출력되고
그렇지 않을 경우 실패 텍스트를 띄우게끔 점프된다.
이때 JNZ 명령은 비교 값이 0이 아닌 경우 특정한 주소로 이동, 0인 경우 점프하지 않고 다음 코드 실행되는 명령이다. 비교된 값이 있어야 하므로 앞에 비교 명령어인 CMP가 먼저 실행되어야 한다.
즉 CMP문을 분석해야 된다.
함수 호출되는 부분에 BP를 걸어두고
임의의 시리얼 값을 입력하여 한줄씩 실행시켜 보았다. (F8: 한줄 실행 - 호출되는 함수의 내부동작까지는 보여지지 않음.)
내가 입력한 시리얼값은 EAX에 저장되었는 걸 볼 수 있다.
그럼 EAX와 비교되는 값이 정답이 될 것이다.
해당 주소 내부 값이 60 61 00 00 으로 저장되어 있다.
해당 값은 리틀엔디언 방식으로 저장되기 때문에 6061을 10진수로 변환하면 안 된다.
리틀 엔디언: 데이터 저장을 위해 메모리에 바이트를 저장하는데, 이 바이트를 저장하는 배열 순서가 엔디언. 리틀 엔디언은 이를 역순으로 저장.
ex) 0x1234
:빅엔디언 - 12 34 /// 리들엔디언 - 34 12
즉 6160을 10진수로 변환해야 된다. 그 값은 24928이다.
'Reversing > Wargame' 카테고리의 다른 글
[Dreamhack] Reversing Basic Challenge #0 (0) | 2024.03.27 |
---|---|
[CodeEngn] Basic RCE - L16 (1) | 2023.11.21 |
[CodeEngn] Basic RCE - L10 (0) | 2023.11.21 |
[CodeEngn] Basic RCE - L09 (1) | 2023.11.21 |
[CodeEngn] Basic RCE - L08 (1) | 2023.11.15 |