OEP를 구한 후 '등록성공' 으로 가는 분기점의 OPCODE를 구하시오.
정답인증은 OEP + OPCODE
EX) 00400000EB03
파일이 패킹되어있는 것 같다. Detect It Easy 툴을 사용해서 PE 파일 정보를 확인했다.
위 사이트에서 die_win64_portable_3.01.zip 을 다운받았다.
압축해제 후, die.exe를 실행하면 바로 사용가능하다.
Aspack v2.0으로 패킹된 것을 확인했다.
1. Hardware breakpoint
2. RETN 0C 찾고 BP를 걸어서 OEP를 찾는다.
두 번째 방법을 사용한다.
과정은 다음과 같다.
1. PUSHAD: 현재 레지스터를 스택에 저장
2. 원본코드를 특정 메모리에 복구
3. POPAD: 원래의 레지스터값을 복구
4. OEP로 분기
- x32dbg에서는 F9로 패킹된 PE 파일의 EntryPoint로 이동할 수 있고, PUSHAD 명령어를 확인할 수 있다.
- 현재 레지스터(EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI)를 스택에 저장한다.
- PUSHAD 명령어에서 좀 내려가면 POPAD 명령어를 확인할 수 있다.
- POPAD로 스택에 저장한 레지스터값에 접근한다.
- POPAD 이후 ret c 명령어를 확인할 수 있다.
- 메모리 및 레지스터 복구 후 OEP로 분기하기 위해 ret c 명령어를 수행한다.
- ret c 이후 push 0과 ret 명령어를 확인할 수 있다.
- 두 opcode에 BreakPoint를 걸고 프로그램을 실행한다.
- x32dbg에서 F7로 실행을 하면서 BP 이전까지 Ctrl + F9로 나가는 과정을 반복하면 BP로 이동하는데, push 0이 push 10.445834로 변경된 것을 확인할 수 있다.
이는 이동하기 위한 주소, 즉 OEP인 445834를 push하고, ret에서 해당 445834 주소로 이동한다.
- ret 이후 00445834 주소로 이동한 것을 확인할 수 있다.
- 이 00445834가 패킹 전 OEP 주소이다.
00445834 주소에서 우클릭 후 다음을 찾기 -> 현재 모듈 -> 문자열 참조를 가면, 문자열들을 확인할 수 있다.
"Registered ... well done!" 이 등록 성공에 대한 문자열이다.
문자열에서 우클릭 후 "디스어셈블리에서 따라가기"를 눌러 해당 주소로 이동해보자.
해당 주소에서 위쪽으로 가면, jen 10.44552B가 있고, 다를 경우 분기하는 곳으로 같으면 다음 명령어로 이동하여 Registerd ... well done! 을 출력한다.
따라서 등록 성공을 출력하는 분기 opcode는 75 55에 해당한다.
정답은 OEP(445834) + opcode(7555) = 4458347555
리버싱 입문 5. 리버싱의 어려운 문제들 (0) | 2021.05.11 |
---|---|
Lena Reversing Tutorial 20 (x32dbg, OEP 찾기, 메모리 덤프) (0) | 2021.05.11 |
CodeEngn Basic RCE L08 (0) | 2021.05.09 |
CodeEngn Basic RCE L06 (0) | 2021.05.09 |
CodeEngn Basic RCE L05 (0) | 2021.05.03 |