클릭하면 키 파일을 체크한다고 한다.
그냥 확인을 해보면 에러메세지를 출력을 하는데 ollydbg로 확인을 해보았다.
PUSHAD라는 명령어를 통해서 레지스터 값을 모두 스택에 적재함을 알 수있다.
패킹의 가능성이 보이기 때문에 패킹의 유무를 확인하고 언패킹을 진행하였다.
첫번째 MessageBoxA의 인자 값이 잘못된것을 볼 수 있다.
함수에 전달할 인자가 부족한거 같다. 문제에서 말한 StolenByte와 연관성이 있어보인다.
StolenByte
▶ 패킹된 바이너리를 언패킹할때, 이러한 과정을 방해하기위한 방법으로 프로그램의 일부 바이트를 별도의 영역에서 실행시킴으로써 OEP를 다른 위치로 가장하고 덤프를 쉽게 하지 못하도록 구현한 기법이다.
올바른 프로그램을 얻기위해서는 StolenByte도 같이 복원해줘야 덤프가 성공적으로 이루어진다.
언패킹을 하기전으로 돌아가서 다시 열어보았다.
PUSHAD가 레지스터 값을 모두 스택에 적재하는 명령어인데 반대로 스택에서 값을 가져오는 명령어는 POPAD가 아닐까 추측을 해보았다 그리고 POPAD에서 PUSHAD로 스택에 적재된 값들이 PUSH되고 있는것을 확인했다.
upx패킹은 코드의 마지막에 있는 JMP명령어를 통해서 원래의 OEP로 가야하는데 원래의 OEP는 0040100C는 OEP가 아니다 원래의 OEP는 00401000이 되어야 한다. 왜냐하면 언패킹을 하고나서 열었을때의 시작주소였기 때문이다.
NOP로 되어있는것으로 해당 부분이 다른 특정 영역에서 실행되고 있음을 알 수 있다.
그래서 StolenByte는 POPAD다음에 오는 PUSH 명령어이다.
그리하여 StolenByte는 0040736E의 6A00 과 00407370의 6800204000이다
따라서 StolenByte는 6A006800204000
노트북이 맛이가서 PC방에서 풀어서 그런가 가독성이 좀 안좋은것 같다.
'CTF > Reversing' 카테고리의 다른 글
Code Engn Basic RCE Level 11 (0) | 2021.05.12 |
---|---|
Code Engn Basic RCE level 10 (0) | 2021.01.28 |
Code Engn Basic RCE level 8 (0) | 2020.12.04 |
Code Engn Basic RCE level 7 (0) | 2020.12.03 |
Code Engn Basic RCE level 6 (0) | 2020.12.02 |