문제입니다.

파일을 한번 실행해 보았습니다.

그리고 register now!를 눌러보았더니

"Wrong Serial,try again!" 메시지를 출력하는 메시지박스가 나타났습니다.

먼저 무엇으로 컴파일 되었는지 확인해보겠습니다.

UPX로 패킹되어 있네요 ~

여기서 UPX란 ?

UPX(Ultimate Packer for eXecutables)는 여러 운영체제에서 수많은 파일 포맷을 지원하는 오픈 소스 실행 파일 압축 프로그램이다. GNU 일반 공중 사용 허가서를 통해 공개된 자유 소프트웨어이다. 압축, 압축 해제의 기능을 모두 담당한다.

[출처]https://ko.wikipedia.org/wiki/UPX

[UPX 구조]

패킹의 장점은 실행파일을 암호화하거나, 압축해서 소스코드를 볼 수 없도록 하고 압축을 할 경우 용량이 줄어들기 때문에 실행속도가 빨라지는 장점이 있습니다. 또한 언패킹 작업이 추가적으로 이루어 져야 하기 때문에 파일에 대한 분석을 어렵게 하는 장점이 있습니다.

upx 언패킹 툴을 이용하면 쉽게 해결되지만 수동으로 한번 언패킹을 진행해보았습니다.

UPX의 경우 PUSHAD라는 명령어가 제일 먼저 보이는데 현재 레지스터의 상태를 보존하기위해 스택에 쓰는 행위를 합니다.F8을 한번 눌러서 진행해보면 스택에 저장되는 것을 확인할 수 있습니다.

레지스터의 값이 모두 스택에 저장된 것을 확인할 수 있습니다.

이제 POPAD라는 것을 알아야 하는데 POPAD는 압축이 해제되고 원본 코드가 실행되기전 PUSHAD로 저장해 놓았던 레지스터 값을 다시 복구시키는데 사용됩니다.

레지스터가 최종 저장된 주소는 12FFA4 입니다.

POPAD를 할경우 "12FFA4 "이 주소에 접근을 하게 되므로 덤프창에서 ctrl+g 를 눌러 "12FFA4 "이 주소를 찾고 브레이크 포인트를 걸어보겠습니다.

이후 F9를 눌러 진행하다보면 POPAD이후 원본코드로 이동하는 JMP명령어를 발견할 수 있습니다.

F8을 눌러 점프를 해보면!

익숙한 코드가 보이지요 ~

이곳이 OEP(Original Entry Point)입니다.

이 부분에서 덤프를 뜨면 됩니다.

"05_unpack.exe"라는 명으로 덤프를 떴습니다.

PEID로 확인해보면 언패킹된 것을 확인 할 수 있습니다.

이제 이 파일을 올리디버거로 열어 문제를 풀어보겠습니다.

우리는 시리얼이 맞지 않을 때 "Wrong Serial,try again!" 라는 메시지 박스를 띄우는 것을 알고 있기 때문에

"Wrong Serial,try again!"문자열로 코드를 찾아 가겠습니다.

[Search for] -> [All referenced text strings]

[마우스 오른쪽클릭] -> [Search for text]

"Wrong Serial,try again!" 에서 앞부분만 검색해 보았습니다.

Entire scope을 체크해서 전체 범위에서 찾도록 해주어야 합니다.

찾았습니다. 그런데.. 저기 수상한 문자열이 보이네요

시리얼 같아 보입니다. 저기로 들어보겠습니다.

break point를 두군데 걸었는데 첫번째 break point부분은 id?를 검증하는 분기, 두번째 break point는 시리얼을 검증하는 분기문입니다.

고대로 입력을 해보면!

인증에 성공하게됩니다.

문제는 시리얼넘버를 구하는 것이므로 "GFX-754-IER-954"값으로 인증을 해주면!

Basic RCE L05 성공!

'WAR GAME > CodeEngn(Basic)' 카테고리의 다른 글

Basic RCE L07  (2) 2020.04.29
Basic RCE L06  (2) 2020.04.29
Basic RCE L04  (2) 2020.04.29
Basic RCE L03  (2) 2020.04.28
Basic RCE L02  (2) 2020.04.28

+ Recent posts