검색하면 나온다.
실행도 안되고 디버깅 프로그램으로도 열리지 않는다. 그런데 HxD로 보면 패스워드를 확인할 수 있다.
IDA로 열어서 함수명들을 살펴보면 문자열 비교 함수를 찾을 수 있다. 정답 입력할 때 '_'는 빼고 입력해야 한다.
IDA로 열어서 main_0함수 디컴파일 하면 해당 함수의 이름을 알 수 있다.
패킹이 되어 있다.
언패킹을 해주고,
올리디버거로 열어서 참조된 문자열 리스트에서 하단으로 내려보면 키를 확인할 수 있다.
정답인증은 OEP + Serial
Ex) 00400000PASSWORD
5번문제와 같이 언패킹을 해준뒤 올리디버거로 연다.
프로그램이 시작되는 주소가 OEP가 되며, serial은 참조된 문자열 확인을 통해 알 수 있다.
시리얼 입력을 aaaa로 하고 C 드라이브의 이름은 Acer로 되어 있는 상태에서 올리디 버거를 돌려봤다.
"Acer" + "4562-ABEX"
가 되고 Acer부분이 연산루틴을 돈 뒤에(앞 4자리만 연산한다.)
문자열 앞에 "L2C-5781"이 붙어 시리얼이 완성된다.
비교를 하는 0x4010F7에 breakpoint를 걸고 C드라이브의 이름을 CodeEngn으로 바꾼뒤에 실행해서,
생성되는 시리얼을 확인하면 된다.
이때 CodeEngn이 바뀐 부분만 정답으로 제출하면 된다.
역시 upx 패킹이 되어 있다.
언패킹을 하고 올리디버거로 열면 oep를 구할 수 있다.
stolenbyte로 인해서 언패킹이 정상적으로 이루어지지 않는다. 그대로 올리디 버거로 올린 뒤에 수동 언패킹을 하듯 jmp문을 찾아준다.
그럼 그 윗부분에 stolenbyte를 찾을 수 있다. 해당 opcode를 정답으로 제출하면 된다.
정답인증은 OEP + OPCODE
EX) 00400000EB03
이번에는 upx가 아닌 aspack으로 패킹이 되어있음을 확인할 수 있다.
언패킹 하는 방법은 디버깅 툴로 retn 0c 를 찾아서 그 다음 두 명령어에 breakpoint를 걸어 실행하면
push 0 가 oep값으로 바뀌어서 retn을 통해 oep로 이동하는 것이다.
breakpoint를 걸어주고
실행하면 push 0 가 push 00445834로 바뀐다. oep주소다.
참조된 문자열을 찾아서 등록완료를 출력하는 부분을 찾으면 그 윗부분에서 분기점의 opcode를 찾을 수 있다.
'WAR GAME > CodeEngn' 카테고리의 다른 글
CodeEngn [Basic RCE] 11 ~ 16 풀이 (0) | 2019.02.10 |
---|---|
CodeEngn [Cryptology] 풀이 (8) | 2019.02.09 |