GCC CTF 2024 – reverse/rAnSoM

    Description

    Jessie recently acquired new computers and set them up with Debian, ensuring to incorporate the most current security enhancements. Nevertheless, two weeks following this setup, she discovers that her secrets file has been encrypted.

    Find the content of the secrets file!


    Decompiled-src

    start

    void __noreturn start()
    {
      _BYTE *v0; // esi
      int v1; // ecx
    
      __asm { int     80h; LINUX - sys_open }
      secret_fd = 5;
      __asm
      {
        int     80h; LINUX - sys_read
        int     80h; LINUX - sys_close
      }
      v0 = &secret_content;
      __asm { int     80h; LINUX - sys_newuname }
      v1 = 0;
      while ( *v0 )
      {
        *v0 = (edata.nodename[v1] ^ *v0) + 1;
        ++v0;
        if ( ++v1 >= 6 )
          v1 = 0;
      }
      __asm { int     80h; LINUX - sys_creat }
      enc_fd = 8;
      __asm
      {
        int     80h; LINUX - sys_write
        int     80h; LINUX - sys_close
        int     80h; LINUX - sys_exit
      }
    }

    sys_newuname 시스템 콜을 이용하여 사용자명을 가져온다.
    6바이트씩 반복해서 18바이트의 _edata에 저장된다.
    문제 설명을 보면 사용자명이 “debian”이기 때문에 _edata는 아래와 같다.

    xor_box = \
    [0x64, 0x65, 0x62, 0x69, 0x61, 0x6e] * 3

    0x64 = d,
    0x65 = e,
    0x62 = b,
    0x69 = i,
    0x61 = a,
    0x6e = n

    18바이트의 원문인 secrets.txt.를 xor_box의 1바이트씩 순회화면서 XOR 연산하고 1을 더해서
    write 시스템 콜을 이용해서 secrets.txt.enc 암호화 파일을 저장한다.

    solve.py

    with open("secrets.txt.enc", 'rb') as f:
        enc = f.read()
    
    xor_box = \
    [0x64, 0x65, 0x62, 0x69, 0x61, 0x6e] * 3
    
    for i in range(18):
        print(chr((enc[i] - 1) ^ xor_box[i]), end='')

    암호화된 secrest.txt.enc 파일 내용으로부터 1바이트씩 1을 빼고 XOR 연산을 하면 원문 데이터를 구할 수 있다.

    Result

    seo@seo:~/Documents/gcc_ctf_2024/ransom$ python3 solve.py
    GCC{S1MPL3_0BFU!!}

    답글 남기기

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