Description

    이 문제는 사용자에게 문자열 입력을 받아 입력값을 검증하고 플래그를 출력하는 프로그램이 주어집니다.
    해당 바이너리를 분석하여 플래그를 찾으세요!

    플래그 형식은 DH{…} 입니다.

    Files

    ubuntu@WSL2:~/CTF/dreamhack.io$ tree r-xor-t
    r-xor-t
    └── chall
    
    0 directories, 1 files
    
    ubuntu@WSL2:~/CTF/dreamhack.io$ file r-xor-t/chall
    r-xor-t/chall: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=33a237858013fb8a830e1f65ea327ab9c78dba62, for GNU/Linux 3.2.0, not stripped

    64비트 리눅스용 실행 파일 하나.

    분석

    main

    int __cdecl main(int argc, const char **argv, const char **envp)
    {
      int k; // [rsp+4h] [rbp-Ch]
      int j; // [rsp+8h] [rbp-8h]
      int i; // [rsp+Ch] [rbp-4h]
    
      puts("Input: ");
      __isoc99_scanf("%s", input);
      if ( strlen(input) == 64 )
      {
        for ( i = 0; i <= 63; ++i )
          rot[i] = (input[i] + 13) & 127;
        result[0] = rot[63];
        for ( j = 1; j <= 62; ++j )
          result[j] = rot[63 - j];
        result[63] = rot[0];
        for ( k = 0; k <= 64; ++k )
          result2[k] = result[k] ^ 3;
      }
      if ( !strncmp(result2, "C@qpl==Bppl@<=pG<>@l>@Blsp<@l@AArqmGr=B@A>q@@B=GEsmC@ArBmAGlA=@q", 0x40uLL) )
      {
        puts("\nNice!");
        printf("Flag is DH{%s}\n", input);
      }
      return 0;
    }
    1. 사용자로부터 64바이트의 input 값을 입력받는다.
    2. 각각 하나의 문자를 아스키 코드 값으로 생각해서 13을 더하고 127을 AND 연산한다.
      연산한 값들은 rot 변수에 저장된다.
      char형식으로 나타나야 하기 때문에 127을 AND 연산하는 듯 하다.
    3. 각각 하나의 문자를 역순으로 result에 저장시킨다.
    4. result에 저장된 각각 하나의 문자를 3과 XOR시켜서 result2에 저장한다.

    풀이

    역순으로 계산하면 답이 나온다.

    1. “C@qpl==Bppl@<=pG<>@l>@Blsp<@l@AArqmGr=B@A>q@@B=GEsmC@ArBmAGlA=@q” 64바이트 문자열을 3과 XOR시킨다.
    2. XOR시킨 문자열에 있는 각각 하나의 문자를 역순으로 문자열을 다시 저장시킨다.
    3. 역순으로 저장한 문자열에 있는 각각 하나의 문자의 아스키코드값에서 13을 빼서 문자열을 다시 저장시킨다.

    Solution

    result2 = "C@qpl==Bppl@<=pG<>@l>@Blsp<@l@AArqmGr=B@A>q@@B=GEsmC@ArBmAGlA=@q"
    result = ""
    rot = ""
    input = ""
    
    for i in range(len(result2)):
        result = result + chr(ord(result2[i]) ^ 3)
    
    for i in range(len(result)):
        rot = rot + chr(ord(result[len(result) - i - 1]))
    
    for i in range(len(rot)):
        input = input + chr(ord(rot[i]) - 13)
    print(input)
    PS Microsoft.PowerShell.Core\FileSystem::\\wsl.localhost\Ubuntu\home\ubuntu\CTF\dreamhack.io\r-xor-t> python3 solve.py
    e615b75a4d563ac971466e05641d7aed556b62fcb460b6027f126bff411bfe63

    FLAG

    DH{e615b75a4d563ac971466e05641d7aed556b62fcb460b6027f126bff411bfe63}

    답글 남기기

    이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다