OEP를 구한 후 '등록성공' 으로 가는 분기점의 OPCODE를 구하시오.
정답인증은 OEP + OPCODE
EX) 00400000EB03
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를 얻을 수 있었다.
PUSHAD
: 패킹의 시작부분, 레지스터를 모두 스택에 저장POPAD
: 레지스터값 복구-> OEP알아내려면 retn 0c
부분 찾기