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}