문제 : Unpack을 한 후 Serial을 찾으시오.
정답인증은 OEP + Serial
Ex) 00400000PASSWORD
답 : 00401360AD46DFS547<-- (드래그)
1. 프로그램 살펴보기
일단은 늘 해왔듯이 프로그램부터 실행해서 살펴보겠다.
간단하게 시리얼을 입력하는 프로그램이다. asdf를 입력하고 버튼을 눌러 보았다.
역시나 에러 메시지박스가 발생한다. 그 외에 특징은 없으며, 올바른 시리얼을 입력하면 성공을 알리는 메시지박스가 뜰
것이라고 예상할 수 있다.
또한 Detect It Easy로 패킹 여부등을 살펴보았다.
UPX로 패킹이 되어있음을 알 수 있었다. 이제 코드를 분석해 보자.
2. 코드 분석
복잡하고 이때까지 본 적이 없던 PUSHAD라는 명령어도 보인다. 일단 UPX로 패킹된 프로그램은 POPAD를 찾으면 그 아래에 OEP(Original Entry Point)로 점프하는 명령어도 찾을 수 있기 때문에, POPAD를 찾아보았다.
POPAD가 보인다! 또한 밑의 명령어 JMP 00401360이 OEP로 이동하는 명령어라고 짐작해 볼 수 있다.
'그렇다면 F8을 눌러서 가면 되겠지'라고 생각할 수 있지만, 파란색 네모 부분의 무한루프로 인해 지나갈 수 없다.
따라서 JNE명령어 실행전 제로 플레그를 1로 바꾸어주고 루프를 빠져나와 드디어 OEP에 도달했다.
자 그럼 첫번째로 구해야 하는 OEP는 00401360으로 구했다. 이제 언패킹을 할 차례이다.
3. 언패킹
OEP를 찾았으니 OllyDumpEx을 통해 언패킹 된 프로그램을 얻어보겠다.
플러그인메뉴에서 OllyDumpEx를 실행하면 이런 창이 뜬다.
아까 구한 OEP 00401360에서 00400000을 빼면 00001360이 되므로 밑줄친 부분에 입력해주고 확인 버튼을 누른다.
그러면 언패킹 된 프로그램을 얻어낼수 있다.
4. IAT 복구
그 후 IAT가 손상되었으므로 LordPE를 통해 IAT를 복구해줘야 한다. (복구하지 않으면 오류가 뜬다.)
복구 방법은 LordPE를 실행하여 Rebuild PE를 누른 후 아까 새로 얻어낸 프로그램을 선택후 나오는 창의 OK를 누르면 된다.
5. 다시 디버깅
이제 두번째 목표인 시리얼 값을 찾아보겠다. 일단 처음에 프로그램을 살펴볼때 나왔던 "Wrong Serial"이라는 문자를 단서로 찾아보겠다. 문자열 검색창을 열어보았다. 그 중 "Wrong Serial"이라는 문자가 보여 클릭하니 이런 화면이 나왔다.
0040107B로 보아 사용자가 입력한 문자와 AD46DFS547이 일치하면 그대로 밑의 명령어를 수행하여 성공창이 뜨고,
일치하지 않으면 JNZ명령어가 실행되어 Wrong serial창이 뜨는 것으로 보인다.
이러한 가설을 토대로 AD46DFS547을 프로그램의 텍스트박스에 넣고 버튼을 눌러보았다.
역시 예상대로 "You got it ;)이라는 창이 뜬다.
6. 정답 입력
아까 구한 OEP값과 시리얼 값을 붙여서 나온 정답을 코드엔진 Auth에 입력해 정답임을 확인했다.
'리버싱 > 리버싱 문제 코드엔진' 카테고리의 다른 글
코드엔진 Basic RCE L08 (0) | 2021.07.21 |
---|---|
코드엔진 Basic RCE L07 (0) | 2021.07.21 |
코드엔진 Basic RCE L05 (0) | 2021.05.25 |
코드엔진 Basic RCE L03 (0) | 2021.05.18 |
코드엔진 Basic RCE L02 (0) | 2021.05.18 |