코드엔진 Basic RCE L12 문제를 풀어보았다.
문제는 다음과 같다. 키 값과 성공 메시지 대신 키 값이 MessageBox에 출력되도록 할 때 그 주소 영역을 찾는 문제이다.
파일을 실행시켜보면 키를 입력할 수 있는 창이 뜨는데, 체크 버튼을 눌러도 아무것도 실행되지는 않는다.
DIE에 올려보았다. 패킹되어있지는 않다고 뜬다.
다음으로 IDA에 올려보았다. 그리고 F5
를 눌러 디컴파일해보았다. win32api 소스코드가 뜬다. DialogBoxParamA
의 DialogFunc
에 들어가보았다.
여러 줄의 코드가 나온다.
코드를 전체적으로 둘러보다가, 38번째 행의 MessageBoxA
에서 Text가 Congratulation, you found the right key
인 것을 발견했다. (이 메시지를 출력한다)
DlgItemInt
를 시리얼 키라고 짐작했는데, MessageBoxA에 영향을 미치는 곳이 그것밖에 없었기 때문이다. 그래서 시리얼 키가 2049480383
일 때 Congratulation, you found the right key
를 출력한다고 했으므로 이게 시리얼 키일 것이라고 생각했다. → 정답이었다!
이제 성공메시지 대신 Key 값이 MessageBox
에 출력 되도록 파일을 패치해야 한다. x64dbg로 파일을 패치해보자. 아래의 사진처럼 성공메시지 자리에 key값을 덮어씌워주면 될 것 같다. 중요한 점은 끝에 NULL(0x00)을 넣어주어 문자열의 끝을 알려주어야 한다는 것이다.
Ctrl + E를 눌러 데이터를 편집해준다. 아스키코드 표를 보고 2049480383
가 출력되도록 코드를 편집해준다. 그리고 마지막에는 문자열의 끝을 뜻하는 NULL(0x00)을 삽입해준다.
그리고 파일
- 파일패치
- 파일패치
를 눌러 파일을 패치해준다.
패치한 파일을 열어서 키를 입력해주면 성공 메시지 대신 키가 출력되는 것을 알 수 있다!
그런데 문제에서는 HexEdit으로 오픈한 다음 주소 영역을 찾으라고 했다. 패치한 파일을 헥스 에디터로 열어보자.
Ctrl + F
를 눌러 key값을 검색해 키가 덮어씌워진 구역으로 이동했다. 키가 0x0D3B - 0x0D45
영역에 덮어씌워져있는 것을 알 수 있다.
따라서 답은 2049480383(키) + 0D3B(주소 시작) + 0D45(주소 끝)인 20494803830D3B0D45
이다!