ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • lvl 20
    Wargame/CodeEngn Basic RCE 2019. 1. 9. 13:22

    문제





    Korean :
    이 프로그램은 Key파일을 필요로 하는 프로그램이다.
    위 문구가 출력되도록 하려면 crackme3.key 파일안의 데이터는 무엇이 되어야 하는가
    Ex) 41424344454647
    (정답이 여러개 있는 문제로 인증시 맞지 않다고 나올 경우 게시판에 비공개로 올려주시면 확인해드리겠습니다) 






    풀이


    → 프로그램을 실행한다. 프로그램은 정상적으로 실행되나, 아무 기능이 동작하지 않는다.






    → IDA 도구를 이용하여, 디스어셈블하여 분석한다.





    → 문제에서 CRACKME3.KEY 파일을 필요로 한다고 나타났으며, 프로그램 시작과 동시에 CreateFileA 함수를 이용하여 해당 파일을 언급하는 것을 확인할 수 있다. 




    → 사실 함수명에 의하면, 파일을 생성하는 줄 알았지만, dwCreationDisposition 파라미터가 3이면 파일이 존재할 경우만 Open 하는 용도로 사용되는 것을 확인했다.

    (msdn: https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-createfilea)





    → 다음, 해당 파일의 내용의 길이를 체크하는 분기를 확인할 수 있다. 








    → 길이가 12h 여야 하므로, 18 바이트 데이터를 CRACKME3.KEY 파일에 저장해야 한다.






    → 다음은, 아래와 같은 분기를 확인할 수 있다. 해당 부분도 우회해야 하는데, EAX 레지스터에 입력된 값은 49484746 이고, 비교하는 값은 1234525Fh 값이다. 49484746 값은 아스키코드 값을 해석하면 사용자가 key 파일에 저장한 마지막 4바이트 글자 IHGF 이다. 따라서 마지막 4바이트 역순으로 아스키코드 값상 1234525F 를 맞추어 주어야한다.






    → 마지막 4바이트를 역순으로 1234525F 를 맞추어 주기 위한 아스키코드 값은 아래와 같이 써야한다.






    → 아스키코드 표에서 찾은 값을 key 파일에 아래와 같이 저장한다.






    →  해당 분기도 정상적으로 우회했으며, 여기까지 그냥 실행하면 다음과 같은 메시지를 출력하는데에 성공한다.






    → 알 수 없는 문자열이 같이 출력되며, 저 공간에 "CodeEngn"이라는 값을 출력되도록 성공해야 한다. 지금 출력되는 ppppppp 같은 알 수 없는 문자열이 어느곳에 저장되며 그 저장된 곳에 값이 어떻게 생성되는지를 분석한 결과, 아래와 같은 sub_401362 함수에서 Alert 메시지가 출력되는 것으로 추측된다.





    → sub_401362 함수를 Trace 하면, 다음과 같은 코드에 의해서 Alert 메시지 함수가 실행된다.






    → 아래 코드에서, key 파일의 내용인 12345.... 에서 pppp.... 로 변경되는 것을 확인할 수 있다. 해당 값은 offset unk_402008 에 저장되어 있으며, sub_401511 함수를 실행한 후에는 값이 변경된 것을 확인할 수 있다. 






    → 변경되기 전 402008 저장소의 내용이다.




    → 변경되는 로직은 아래와 같다.





    → 해당 로직을 디버깅하면서 주석을 추가했다. 주석과 같은 로직으로 값이 변경된다.




    → XOR연산하는 구간을 알았으므로, 나는 "ppppp..." 문자열 대신에 "CodeEngn" 이라는 문자열을 생성해야 한다. 구현되는 식은 아래와 같다.


    x[0] ^ 41h = C (43)

    x[1] ^ 42h = o (6F)

    x[2] ^ 43h = d (64)

    x[3] ^ 44h = e (65)

    x[4] ^ 45h = E (45)

    x[5] ^ 46h = n (6E)

    x[6] ^ 47h = g (67)

    x[7] ^ 48h = n (6E)


    → xor 연산에 이항연산은 아래와 같이 변경할 수 있다.


    x[0] = 41h ^ C (43h)    =    2

    x[1] = 42h ^ o (6Fh)    =    2D

    x[2] = 43h ^ d (64h)    =    27

    x[3] = 44h ^ e (65h)    =    21

    x[4] = 45h ^ E (45h)    =    0

    x[5] = 46h ^ n (6Eh)    =    28

    x[6] = 47h ^ g (67h)    =    20

    x[7] = 48h ^ n (6Eh)    =    26



    → 연산 결과를 구했으므로, 다음과 같이 key 파일을 변경한다. 그 뒤에 바이트 자리는 0으로 만들어주기 위해서, 동일한 xor 연산이 이루어지도록 값을 입력하면 된다. xor 연산된 값의 총 합이랑 0x12345678h랑 xor 연산을 통한 값이랑 EAX 레지스터와 비교하여 Alert 창 메시지를 실행하는 로직이 실행되는 부분을 확인했다.






    → 따라서, 기존의 마지막 4바이트 값인 5F523412인 값을 계산된 값인 7B553412 값으로 변경해야 한다. 완성된 key 파일은 아래와 같다.






    → xor 연산을 통해 완성된 첫 8바이트와 그 후, NULL 값으로 채우기 위한 바이트 그리고 마지막 4바이트를 계산하여 key 파일을 만들어내는게 포인트인 문제이다.



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

    lvl 19  (0) 2019.01.09
    lvl 18  (0) 2019.01.07
    lvl 17  (0) 2019.01.06
    lvl 16  (0) 2019.01.04
    lvl 15  (0) 2019.01.03

    댓글

Designed by Tistory.