ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Lena's tutorial #1 분석
    IT/리버싱 2018. 1. 27. 13:01
    Lena's tutorial #1 분석



    프로그램 동작 분석


    프로그램 동작에 대해서 살펴보겠습니다.

    아래 링크를 통해서 실습파일 다운받으세요.

    Lena's tutorial #1 다운로드

    아래 그림은 Lena 튜토리얼 1번 프로그램을 실행한 결과입니다. "Evaluation period out of date. Purchase new license"라는 메시지박스가 뜨며, OK 버튼을 누르면 프로그램이 종료됩니다..


    올리디버거로 디버깅할 파일은 엽니. 처음 나타나는 GetModuleHandle, LoadIcon, LoadCursor는 윈도우 API 함수로 분석을 할 필요가 없습니다.

     아래 그림은 위의 세가지 윈도우 API 함수 뒤에 바로 나오는 CreateFile 함수입니다. ModeOPEN_EXISTING으로 파일이 존재할 경우에 오픈합니다. FileNameKeyfile.dat입니다. , 이름이 Keyfile.dat인 파일이 존재 하는지 확인하는 함수입니다.



    아래 그림은 CreateFile 함수의 OPEN_EXISTING 모드에 대한 설명입니다.

     


    Keyfile.dat 파일이 존재하지 않는다면 CreateFile 함수의 리턴 값으로 EAXFFFFFFFF가 저장됩니다. FFFFFFFF-1입니. 다음 401078 주소의 명령어를 통해서 EAX 값과 -1을 비교하게 됩니다. 그 결과 Zero flag1로 활성화 됩니다. 40107BJNZ 명령어에 의해서 40109A 주소가 아닌 바로 아래 주소인 40107D로 넘어가게 됩니다.



    40107D 주소를 살펴보도록 합니. 아래 그림을 보면 MessageBox 함수가 보입니다. TitleText 내용을 보면 처음 프로그램을 실행했을 때 나타나는 메시지박스와 같은 것을 확인 할 수 있습니다. 메시지박스 함수가 끝나면 ExitProcess 함수를 호출해 프로그램을 종료하게 됩니다.

     


    리버싱


    아래 그림은 프로그램에 관련된 Text Strings 값들입니다. 프로그램 분석 때 보았던 Text 뿐만 아니라 다른 Text들도 많이 보입니다. 그 중에서 “You really did it! Congratz !!!” 라는 Text가 보입니다. 해당 Text로 보아 위의 문자가 포함된 메시지박스를 띄우는 것이 이 프로그램의 목적인 것으로 예상됩니다.

     


    가장 먼저 CreateFile 함수를 조작해야 합니다. Keyfile.dat 파일이 존재하지 않으면 메시지박스와 함께 프로그램을 종료하기 때문입니. 그렇다면 Keyfile.dat 파일을 생성하면 됩니다. 혹은 401078 주소의 JNZ 명령어를 JE로 수정을 하면 됩니다. 후자의 방법으로 진행하도록 합니다.

     


    그러면 40109A 주소로 이동하게 됩니. 이 주소에는 아래 그림과 같이 ReadFile 함수가 존재합니다. Createfile 함수를 통해서 열었던 Keyfile.dat 파일의 내용을 읽는 함수입니. BytesToRead의 값이 46인 것으로 보아 Keyfile.dat 파일 내용의 최대 70바이트를 읽는 것을 확인할 수 있습니. 또한 Buffer의 주소를 40211A로 두어 Keyfile.dat 파일의 내용의 최대 70바이트를 저장합니.



    또한 ReadFile 함수 내에서 Keyfile.dat에 저장되어 있는 내용의 바이트 수를 402173 주소에 저장시킵니다최대값은 BytesToRead의 값인 46입니다. 하지만 파일을 생성하지 않았기 때문에 4010B0 주소에 있는 JNZ 명령어를 JE로 수정합니다.

     아래 그림을 보면 402173 주소에 있는 값과 10을 비교하고 있습니다. , Keyfile.dat 파일의 내용이 16바이트보다 작을 경우 4010F7 주소로 이동하게 됩니다.

     


    4010F7 주소로 이동해보면 아래 그림과 같이 “Keyfile is not valid. Sorry.” 라는 메시지박스를 확인할 수 있습니다. 그러므로 4010F7로 이동을 하면 안되는 것입니. 그러므로 4010BF 주소의 명령어를 JL에서 JGE로 수정합니다.

     


    아래 그림과 같은 반복문이 나옵니. 40211A 주소에 저장했던 값을 하나씩 읽어서 0(NULL)인지 확인하며, 0(NULL)일 경우 ESI8보다 작은가 확인합니다. 0(NULL)이 아닐 경우 47(G)인지 한번 더 확인합니다. 47(G)가 아닐 경우 ESI값을 증가시키지 않으며, 47(G)일 경우 ESI값을 1씩 증가시킵니. 마지막으로 0(NULL)값을 만나면 ESI 8보다 작은가 확인합니. 그러므로 해당 반복문은 Keyfile.dat 내용에 G8개 이상 적혀 있는지 확인하는 구문입니.

     


    원하는 결과를 얻기 위해서 ESI의 값을 수정하여 반복문을 뛰어넘어야 합니. 4010D3 주소에 있는 명령어에서 ESI와 비교하는 값을 8에서 0으로 수정합니.

     


    401205 주소로 이동하면 “You really did it! Congratz !!!” 메시지박스와 함께 프로세스를 종료하게 됩니다.



    'IT > 리버싱' 카테고리의 다른 글

    [악성코드] 악성코드의 유형  (1) 2017.12.10
    abex' crackme #4 분석  (0) 2017.12.09
    abex' crackme #3 분석  (0) 2017.11.28

    댓글

Designed by Tistory.