ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • lvl 09
    Wargame/CodeEngn Basic RCE 2018. 12. 12. 19:28

    문제



    StolenByte를 구하시오

    Ex) 75156A0068352040





    풀이


    → 프로그램을 실행한다. 키 파일 확인 메시지와 함께 키 파일을 찾을 수 없다는 메시지가 나타난다.





    → IDA로 디스어셈블한 결과, UPX로 패킹된 것을 확인 가능하다. 따라서, 언패킹을 수행한 후 재실행 시 정상적으로 실행되지 않는 것을 확인한다.







    → 언패킹한 바이너리를 디스어셈블한다. 먼저, 첫번째 MessageBox가 에러가 나타났고 해당 함수의 코드를 살펴보면 이상한 점이 존재한다.




    → 현재 MessageBoxA 함수가 실행되기 전 파라미터가 "push 0" 이라는 1개의 파라미터만 전달되었다. 하지만 MessageBoxA 함수를 검색한 결과, 총 4개의 파라미터가 필요한 것을 확인할 수 있다.


    (https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-messageboxa)



    → 나머지 3개가 없기 때문에, 에러가 난 것으로 추측되며 이것이 바로 StolenByte로 추측할 수 있다. 그리고 언패킹 전의 파일에서 MessageBox가 나타났을 때의 문자열이 "Click OK to check for the keyfile." 이라는 것도 알 수 있다. 


    → 다시 패킹된 바이너리를 IDA로 오픈하여 3개의 파라미터를 찾아보았다. 스트링 뷰를 찾아 보았는데, 아무것도 존재하지 않았다. 다시 생각해보니 패킹된 상태이므로 스트링도 패킹되서 보이지 않을거라고 추측하고 OEP 가기전 코드에 BP를 걸고 실행한 후, 스택에 쌓여진 값이 존재하였다.





    → OEP로 점프뛰는 코드 직전에 내가 찾던 문자열의 주소값이 스택에 적재된 것을 찾았다. 즉, 현재 스택에 쌓여있는 3개의 주소 값인 "0", "0x00402000", "0x00402012" 이 쌓여있으며 해당 3개의 데이터는 OEP로 넘어가 MessageBoxA 함수를 실행하는데 사용되는 것이다.





    → 저 3개의 스택을 쌓는 코드를 찾아보니 UPX의 끝부분인 "POPAD" 명령어 직후, 바로 적재하는 것을 확인하였다.


     




    → 이제 정상적으로 실행하기 위해서 바이너리 패치를 진행하였다. 스택을 3개 쌓는 코드를 언패킹 된 바이너리 OEP 이후의 MessageBoxA 함수 위로 옮기는 작업이다.


    → 먼저, 스택을 3개 쌓는 코드의 HEX 값을 기억한다.


    push 0                                6A 00


    push offset dword_402000              68 00 20 40 00


    push offset word_402012               68 12 20 40 00



    → 다음, 언패킹된 바이너리를 보면 MessageBoxA 함수 실행 전, nop 자리에 값을 채운다.





    → 코드 패치 작업이다.





    → 패치한 바이너리를 어셈블리하면 다음과 같다.




    → 패치한 바이너리를 실행하면 정상적으로 실행된다.






    → 정답은 위에 이미 나왔다.

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

    lvl 11  (0) 2018.12.27
    lvl 10  (0) 2018.12.13
    lvl 08  (0) 2018.12.11
    lvl 07  (0) 2018.12.11
    lvl 06  (0) 2018.12.11

    댓글

Designed by Tistory.