Basic RCE 10 문제풀이

Evie·2023년 11월 5일
0

시스템

목록 보기
20/22

🔎문제

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

📂 OEP란?

Original Entry Point
패킹된 파일이 실제로 시작하는 프로그램 시작 부분이다.

실행 압축에 대한 자세한 내용은 여기로~!
https://velog.io/@eunbi2222/리버싱핵심원리-실행압축

압축된 파일은 PEiD 툴로 분석할 수 있는데

확인해보니 ASPack패커로 패킹되어있었다.
해당 패커는

PUSHAD
...
POPAD
...
JMP OEP

구성으로 되어있다고한다. 그럼 POPAD명령어를 찾아봐야겠다!

🤖실행

name과 serial number를 입력하는 프로그램이다
근데! 작성이 안됨다
한번 분석해보자!

✅풀이

분기점을 구하는 문제여서
x32디버거로 열었다

EntryPoint에 pushad 명령어를 확인할 수 있었다.

OEP를 찾기위해 명령어 검색으로 popad를 검색해봤지만
너무 많이 있어서 넘어갔다

다시 찾아보니
ASPack의 언패킹 과정에서 OEP로 RETN하기 전 RETN 0c과정이 붙어있다고 한다. 그래서 바로 ctrl+F

내 디버거에서는 RETN 0c가 아니라 ret c로 나와있어서 찾는데 시행착오가 많았다... retn 12로도 해보고 ret0c로도 해보고...
그래도 드디어 발견한 popad명령어

breakpoint걸어주고 실행시킨 결과, push에 OEP의 주소로 설정된것을 볼 수 있었다.
바로 f7로 이동해서

OEP의 주소를 알아낼 수 있었다.


이제 분기점을 찾아보자!

String 검색으로 registered...well done! 이 출력되는 부분을 찾았다.
근데 실행압축 되어있는 프로그램이다보니, 실행 시점에 따라 해당 부분으로 이동 해도 아무것도 없는 경우가 있어서 breakpoint 걸어두고 적절히 압축도 풀어주면서 이동해야 원하는 곳으로 갈 수 있었다.


이렇게 이동한 곳에서 경험상 위에 분기점이 있겠거니..
하고 찾아보니 함수를 call하고 그 리턴값을 비교하는 jne 명령어를 확인 할 수 있었다.

여기가 분기점이구나! 하고 opcode 7555를 붙여 key를 입력해

success를 얻을 수 있었다.

🤓 새로 배운 내용

  • ASPack의 언패킹 과정
    1.PUSHAD : 패킹의 시작부분, 레지스터를 모두 스택에 저장
    2.압축 해제 (원본 코드 복구)
    3.POPAD : 레지스터값 복구
    4.RETN 0C
    5.OEP로 RETN

-> OEP알아내려면 retn 0c 부분 찾기

profile
공부합시다

0개의 댓글