Q10. OEP를 구한 후 '등록성공' 으로 가는 분기점의 OPCODE를 구하시오. 정답인증은 OEP + OPCODE EX) 00400000EB03

Name과 Serial 값을 받는 프로그램이다.

OllyDbg로 열어보면 10.exe의 EP는 코드 바깥에 있으므로, BP를 걸때 이를 명심하라는 경고창이 나온다.

이후엔 실행 압축 코드라는 정보도 얻을 수 있었다.

Aspack이라는 패킹으로 되어있는 프로그램이다.
Aspack을 언패킹 하는 방법에 대해 구글링을 해보다가 여러 정보를 얻을 수 있었다.
1. OEP를 구해야 하는 문제라면 패킹이 되어있을 것이다.
- 패킹된 파일의 실제 프로그램 시작 부분을 OEP라고 하기 때문이다.
2. Aspack 언패킹 방법 | 출처 : [ASPACK Unpacking]MUP
[ASPACK Unpacking]MUP
ASPACK의 언패킹에 대해서 정리를 하겠습니다. suspect.exe파일을 Exeinfo PE로 보면 Aspack v2.0 으로 패킹이 되어있는 것을 확인 가능합니다. ASPACK을 언패킹하는 것은 2가지 방법이 있습니다. 더 있을수도
suspected.tistory.com
- Hardware BP를 이용해서 푸는 방법
- RETN 0C를 찾아서 BP를 걸어 실행 후 OEP로 가는 방법
위 2가지의 방법 중에서 후자를 선택해서 언패킹을 진행해보았다.
3. ASPACK의 특징
PUSHAD → 복호화 코드 실행 → POPAD → RETURN 0C → OEP 값 PUSH → Return OEP 주소로 이동

PUSHAD명령어로 현재 레지스터 값을 스택에 저장하고 원본 코드 특정 메모리 상에 복구이후 POPAD로 레지스터가 복구되면 OEP로 분기가 된다.

456001주소에서 PUSHAD 명령어를 확인해 볼 수 있었다.
PUSHAD명령어는 범용 레지스터들에 저장된 값들을 스택에 저장하는 명령어이다.
→ 패킹되어 있는 대부분의 파일이 첫 구문에서 PUSHAD를 볼 수 있다.
→ 현재 레지스터 값을 스택에 저장하고, 원본코드를 특정 메모리상에 복구 시킨 다음
POPAD를 이용해서 원래의 레지스터 값을 복구하여 사용하기 위해 사용하는 것

F8을 통해 456001주소의 PUSHAD 명령어만 실행했을 때의 레지스터 창이다.
PUSHAD명령어로 현재 레지스터 값을 스택에 저장한 값을 알아보기 위해
레지스터의 ESP주소에 우클릭 > Follow in Dump 를 이용하여 ESP가 가리키는 메모리 주소를 확인한다.

우클릭 하여 BP > Hardware, on access > Dword로 BP를 걸어준다.
여기서 DWORD는 4바이트 크기를 의미하며, 메모리 크기를 4바이트로 지정하는 의미이다.

이후 F9를 눌러 실행시키면 JNZ 명령어에서 브레이크가 걸리게 된다.
[그림 8]에서 4564F9 주소에서 RETN 0C 명령어가 보이고
다음 PUSH 명령어를 통해 00445834 주소를 스택에 저장한 후
456501 주소의 RETN 명령이 실행되는 것을 확인했다.

456501 주소에서 F8을 한 번 더 눌러보면 다음과 같은 화면을 볼 수 있다.
DB ~ 로 보여지는 화면은 OllyDbg가 분석하지 못했을 때 나타나면 화면이다.

여기서 패킹 되어있는 코드를 정렬해주는 단축키인 ctrl + a(analyse code)를 누르면 언패킹이 완료된다.
차이가 있다면 보이지 않던 ASCII 문구들을 확인해 볼 수 있다.
이때 언패킹이 완료된 상태이므로 OEP는 00445834가 되며,
OPCODE를 찾기 위해서 등록성공으로 가는 분기점과 관련된 단서를 찾아야 한다.

[그림 11] 과정을 통해 등록성공에 관련한 정보를 찾기위해 모든 text에 대해서 탐색을 진행한다.

“Registerd … well done!” 이라는 문구 확인 후 해당 주소로 더블클릭하여 이동해보았다.

등록 성공으로 가는 분기점인 4454D4주소의 JNZ 명령어를 확인할 수 있다.
이때의 OPCODE는 75 55 이다.
따라서 정답을 조합해보면 OEP + OPCODE = 004458347555 가 된다.
풀이 참조 출처 : [CodeEngn] Basic RCE - L10
'Reversing > CodeEngn' 카테고리의 다른 글
| [CodeEngn] RCE basic L12 풀이 (1) | 2025.09.01 |
|---|---|
| [CodeEngn] RCE basic L11 풀이 (2) | 2025.09.01 |
| [CodeEngn] RCE basic L09 풀이 (2) | 2025.09.01 |
| [CodeEngn] RCE basic L08 풀이 (0) | 2025.09.01 |
| [CodeEngn] RCE basic L07 풀이 (2) | 2025.09.01 |