• [Reversing.kr] Ransomware

    2020. 2. 7.

    by. ugonfor

    적절히 nop부분은 함수에서 제외하고 실제 함수있는 부분만 잘 잘라서 아이다로 열어봤습니다.

    함수 콜 하는것도 잘 조절해줘서 예쁘게 만들어줌!!

     

    그랬더니 메인함수가 다음과 같았습니당~

    결국에는 키로 file을 xor하고 반전시키는 거더라구요..

    // positive sp value has been detected, the output may be wrong!
    int __cdecl main_(int argc, const char **argv, const char **envp)
    {
      FILE *fp; // [esp+10h] [ebp-14h]
      unsigned int length; // [esp+14h] [ebp-10h]
      unsigned int lengtha; // [esp+14h] [ebp-10h]
      unsigned int key_len; // [esp+18h] [ebp-Ch]
      int count; // [esp+1Ch] [ebp-8h]
      unsigned int counta; // [esp+1Ch] [ebp-8h]
      unsigned int countb; // [esp+1Ch] [ebp-8h]
      FILE *Stream; // [esp+20h] [ebp-4h]
    
      printf("Key : ");
      nop();
      scanf("%s", key_addr);
      strlen(key_addr);
      nop();
      count = 0;
      Stream = fopen("file", "rb");
      nop();
      if ( !Stream )
      {
        nop();
        printf("\n\n\n파일을 찾을수 없다!\n");
        nop();
        exit(0);
      }
      fseek(Stream, 0, 2);                          // 파일끝으로 이동
      nop();
      length = ftell(Stream);                       // 현재 위치값 반환
      nop();
      rewind(Stream);                               // 파일포인터를 초기
      nop();
      while ( !feof(Stream) )
      {
        nop();
        file_text[count] = fgetc(Stream);
        nop();
        ++count;
        nop();
      }
      nop();
      for ( counta = 0; counta < length; ++counta )
      {
        file_text[counta] ^= key_addr[counta % key_len];// 키를 xor한
        nop();
        file_text[counta] = ~file_text[counta];     // text를 반전
        nop();
      }
      fclose(Stream);
      nop();
      fp = fopen("file", "wb");
      nop();
      nop();
      for ( countb = 0; countb < lengtha; ++countb )
      {
        fputc(file_text[countb], fp);               // 파일 스
        nop();
      }
      printf(
        "\n"
        "파일을 복구했다!\n"
        "나는 몹시 나쁘지만 약속은 지키는 사나이다!\n"
        "따라서 너가 나에게 돈을 줬고, 올바른 키값을 받았다면 파일은 정상화 되어 있을 것이다!\n"
        "하지만 만약 잘못된 키를 넣었다면 나는 아주아주 나쁘기 때문에 너의 파일은 또 망가질 것이다!");
      nop();
      return getch();
    }

     

    그래서! 이제 문제를 푸는 데,

    파일을 decrypt 하라는 데, exe파일이라는 걸 알려줬으니 pe파일 헤더와 file을 읽어와서 적절히 조작해서 key를 찾아냈다. 아래 파일을 잘 읽어보면 key를 찾아내는 과정이 나타나있다.

    from subprocess import*
    
    text = "\xDE\xC0\x1B\x8C\x8C\x93\x9E\x86\x98\x97\x9A\x8C\x73\x6C\x9A\x8B" + "\x34\x8F\x93\x9E\x86\x9C\x97\x9A\xCC\x8C\x93\x9A\x8B\x8C\x8F\x93"
    text_ = [0]*len(text)
    
    mz = "\x4D\x5A\x90\x00\x03\x00\x00\x00\x04\x00\x00\x00\xFF\xFF\x00\x00" + "\xB8\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00"
    
    for i in range(len(text)):
        #print(0xff^ord(text[i]))
        text_[i] = 0xff^ord(text[i])
        
        text_[i] = text_[i]^ord(mz[i])
    
        text_[i] = chr(text_[i])
    
        print(text_[i],end='')
    

     

    그 키를 읽어봤더니, file이 pe파일이 되어서 실행시켜보았고, 근데 실행이 되지 않길래, strings로 문자열만 뽑아보았더니, 답이 있더군요!!

    Key -> Colle S????m (????는 플래그 가리기용 ㅎㅎ)

    'Writeup > Wargame_Writeup' 카테고리의 다른 글

    [ Reversing.kr ] CSHOP writeup  (0) 2020.02.28
    [ Reversing.kr ] AutoHotkey1 Writeup  (0) 2020.02.12
    [Reversing.kr] Position.exe  (0) 2020.02.07
    [Reversing.kr] Direct3D_FPS  (0) 2020.02.07
    [Flare-on 2019] Write up  (0) 2020.02.05

    댓글