Writeup Log

CryptOfTheUndead

## solve

バイナリファイルと暗号化されたファイルが与えられる。

bash
❯ ls -la
total 32
drwxr-xr-x 2 nabeen nabeen  4096 Oct  9  2024 .
drwxr-xr-x 4 nabeen nabeen  4096 Feb 14 01:08 ..
-rwxr-xr-x 1 nabeen nabeen 16512 Oct  9  2024 crypt
-rw-r--r-- 1 nabeen nabeen    34 Oct  9  2024 flag.txt.undead

crypt を Ghidra でデコンパイルしてみると、以下の main であることがわかる。.undead で終わらないファイルを引数として渡せば良さそうに見える。

c
undefined4 main(int param_1,undefined8 *param_2)

{
  int iVar1;
  size_t sVar2;
  char *__dest;
  char *pcVar3;
  undefined4 uVar4;
  long in_FS_OFFSET;
  void *local_40;
  size_t local_38;
  long local_30;
  
  local_30 = *(long *)(in_FS_OFFSET + 0x28);
  if (param_1 < 2) {
    pcVar3 = "crypt";
    if (param_1 == 1) {
      pcVar3 = (char *)*param_2;
    }
    uVar4 = 1;
    printf("Usage: %s file_to_encrypt\n",pcVar3);
  }
  else {
    pcVar3 = (char *)param_2[1];
    iVar1 = ends_with(pcVar3,".undead");
    if (iVar1 == 0) {
      sVar2 = strlen(pcVar3);
      __dest = malloc(sVar2 + 9);
      strncpy(__dest,pcVar3,sVar2 + 9);
      sVar2 = strlen(__dest);
      builtin_strncpy(__dest + sVar2,".undead",8);
      iVar1 = read_file(pcVar3,&local_38,&local_40);
      if (iVar1 == 0) {
        encrypt_buf(local_40,local_38,"BRAAAAAAAAAAAAAAAAAAAAAAAAAINS!!");
        iVar1 = rename(pcVar3,__dest);
        if (iVar1 == 0) {
          iVar1 = open(__dest,0x201);
          if (iVar1 < 0) {
            uVar4 = 5;
            perror("error opening new file");
          }
          else {
            write(iVar1,local_40,local_38);
            close(iVar1);
            puts("successfully zombified your file!");
            uVar4 = 0;
          }
        }
        else {
          uVar4 = 4;
          perror("error renaming file");
        }
      }
      else {
        uVar4 = 3;
        perror("error reading file");
      }
    }
    else {
      uVar4 = 2;
      puts("error: that which is undead may not be encrypted");
    }
  }
  if (local_30 == *(long *)(in_FS_OFFSET + 0x28)) {
    return uVar4;
  }
                    /* WARNING: Subroutine does not return */
  __stack_chk_fail();
}

与えられたファイルを rename してそれを実行時の引数に渡してみると、解読できた。

bash
❯ mv flag.txt.undead flag.txt
bash
❯ ./crypt flag.txt
successfully zombified your file!
bash
❯ cat flag.txt.undead
HTB{und01ng_th3_curs3_0f_und34th}

## flag

  • HTB{und01ng_th3_curs3_0f_und34th}