ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • lvl 10
    Wargame/CodeEngn Basic RCE 2018. 12. 13. 15:26

    문제



    OEP를 구한 후 "등록 성공"으로 가는 분기점의 OPCODE를 구하시오. 정답인증은 OEP+OPCODE

    Ex) 00400000EB03





    풀이


    → 프로그램을 실행한다.





    → 문제에서, OEP를 언급했으므로 패킹된 것으로 추측할 수 있으며 IDA로 디스어셈블하면 UPX가 아닌 다른 값으로 세그먼트가 잡힌 것을 보아 다른 패커를 이용하여 패킹한 것을 알 수 있다.





    → 정확히, 어떤 패커로 패킹된지 알아보기 위해서, PEiD라는 PE프로그램 분석 도구를 이용한 결과 "ASPack 2.000" 인 것을 알 수 있다.





    → UPX와 같은 원리로, PUSHAD와 POPAD 명령어를 통해 파라미터 설정을 하는 것으로 추측하고, 여기에 BP를 걸고 디버깅한다.






    → ASPack 메뉴얼 언패킹 방식을 이해해야 한다. 여기서 언급은 하지 않고 다음 사이트를 참조해서 공부하면 된다.

    (https://tuts4you.com/e107_plugins/download/download.php?view.266)


    → 디버깅하면서, 마지막 retn 까지 코드를 실행하면 IDA에서 EP가 변경되는 것을 감지한다.





    → YES를 클릭하면 OEP로 넘어가며, 해당 코드에서 DUMP를 뜨면 언패킹된 바이너리이다.  DUMP를 위해서 x64dbg에서 바이너리를 오픈한다. 그리고, ASPack 패킹방식에 의하면, "PUSHAD" 명령어 다음 패킹을 풀고 "POPAD" 명령어 다음 OEP로 넘어가기 때문에, POPAD를 찾기 위해서, 다음과 같이 BP를 설정한다.


    (위의 글귀가 이해가되지 않으면, 위에서 언급한 tuts4you Tutorial을 반드시 읽어보기를 바란다.)




    → 그리고 실행하면, POPAD를 찾을 수 있다. 바로 밑에 OEP로 리턴하는 코드가 존재하며 OEP가 0x00445834 임을 알 수 있다.




    → 정상적으로, OEP를 찾아왔으며 덤프를 뜨기 위해서, 다음과 같이 [Scylla] 버튼을 클릭한다.





    → 덤프를 뜨기 위해 다음과 같은 일련의 작업을 한다.


    1. IAT Autosearch 클릭.

    2. Get Imports 클릭.

    3. Dump를 클릭하고 새로운 파일로 저장.

    4. Fix Dump를 클릭하고 저장한 파일을 Fix.





    → 덤프를 뜨는 작업은 완료했으며, 덤프뜬 파일로 재 디버깅한다. 실행한 후 "등록성공"의 분기를 알기 위해서, 스트링을 찾는다. [Search for]-[Current module]-[String reference]를 클릭 후 찾기.






    → 해당 코드로 Follow한 후, 위로 올라가면 찾고자 하는 분기점의 OPCODE를 찾을 수 있다.





    → 언패킹한 바이너리를 뽑는 연습을 하는 문제인 것 같다.




















    'Wargame > CodeEngn Basic RCE' 카테고리의 다른 글

    lvl 12  (0) 2018.12.27
    lvl 11  (0) 2018.12.27
    lvl 09  (0) 2018.12.12
    lvl 08  (0) 2018.12.11
    lvl 07  (0) 2018.12.11

    댓글

Designed by Tistory.