Reversing/CodeEngn

[CodeEngn] RCE basic L09 풀이

chan2s 2025. 9. 1. 14:02

Q9. StolenByte를 구하시오 Ex) 75156A0068352040

[그림 1] 09.exe 실행 시 에러

09.exe를 바로 실행해보았더니 다음과 같은 에러 메세지를 확인해 볼 수 있었다.
가끔 Windows 업데이트를 실행하면 실시간 보호가 다시 켜지는데, 이를 꺼두면 이 에러는 해결할 수 있다.

[그림 2] 09.exe 최초 실행 1
[그림 3] 09.exe 최초 실행 2

09.exe 실행하면 keyfile을 체크한다고 한다.
확인 버튼을 누르면 해당 파일을 찾지 못했다는 메세지가 출력된다.

문제를 풀기에 앞서 Stolen Byte의 의미를 이해하기 위해서 구글링을 진행했다.

[그림 4] Stolen Byte 정의 및 개념

Stolen Byte는 패커가 위치를 이동시킨 코드로, POPAD와 OEP 사이의 연속되는 PUSH를 의미한다.

그렇다면 Stolen Byte를 구해야 하는 이 문제도 무언가 패킹되었다는 힌트를 유추해볼 수 있을 것이다.

[그림 5] Exeinfo PE 09.exe 확인

09.exe는 UPX로 패킹되어 있음을 확인하였다.

[그림 6] 09.exe UPX 언패킹

upx -d  09.exe

UPX 언패킹 툴을 통해 09.exe 언패킹을 진행했다.

[그림 7] OllyDbg 언패킹한 09.exe 로드

언패킹한 09.exe를 OllyDbg로 로드해서 보면 글자가 깨져 보인다.

[그림 8] OllyDbg 언패킹한 09.exe 로드

언패킹된 09.exe에서 00401000~0040100B까지 총 12바이트가 NOP로 이루어진 모습이다.
해당 부분이 NOP으로 채워져 있기에 MessageBox가 출력될 때 폰트가 깨져 보이는 것이다.

이 상태로는 POPAD와 OEP 사이의 값을 알아낼 수 없었다.
하지만 OEP는 401000이라는 정보를 얻고 다시 원본 09.exe를 로드해서 분석을 진행해야 했다.

[그림 9] OllyDbg 원본 09.exe 로드

OllyDbg로 원본 09.exe를 로드해서 F8을 한 번 누르면 볼 수 있는 화면이다. 이때의 EP는 4071F0임을 확인했다.

[그림 10] Stolen Byte

 내리면서 분석을 진행해보니 40736D 주소에서 POPAD와 407387 주소에서 OEP 주소와 근접한 주소를 찾을 수 있었다.

POPAD와 OEP 사이의 연속되는 PUSH를 Stolen Byte라고 했으므로,
[그림 10]에서 Stolen Byte를 찾아보면 40736E ~ 407375주소에서 볼 수 있는 PUSH 명령어다.
따라서 09.exe의 Stolen Byte는 PUSH명령어 3줄의 12바이트 데이터인 6A 00 68 00 20 40 00 68 12 20 40 00 이다.

정답은 6A0068002040006812204000 이다.

'Reversing > CodeEngn' 카테고리의 다른 글

[CodeEngn] RCE basic L11 풀이  (2) 2025.09.01
[CodeEngn] RCE basic L10 풀이  (3) 2025.09.01
[CodeEngn] RCE basic L08 풀이  (0) 2025.09.01
[CodeEngn] RCE basic L07 풀이  (2) 2025.09.01
[CodeEngn] RCE basic L06 풀이  (3) 2025.09.01