Este é mais um desafio que utiliza elementos aleatórios, porém com a seed sendo time(NULL). Analisando pelo Ghidra, vemos que o código executa um loop de 100 iterações, no qual, cada iteração calcula uma posição aleatória em uma lista chamada cookies, e pede um input para o usuário.
Se o input for diferente do cookie selecionado, a execução encerra, porém se for igual todas as vezes, a flag é impressa.
main.c
undefined8 main(void)
{
int iVar1;
time_t tVar2;
size_t sVar3;
FILE *__stream;
long in_FS_OFFSET;
int local_f8;
char local_e8 [112];
char local_78 [104];
long local_10;
local_10 = *(long *)(in_FS_OFFSET + 0x28);
tVar2 = time((time_t *)0x0);
srand((uint)tVar2);
puts("Give me the cookie I want a 100 times in a row and I\'ll give you the flag!");
fflush(stdout);
for (local_f8 = 0; local_f8 < 100; local_f8 = local_f8 + 1) {
iVar1 = rand();
strcpy(local_78,*(char **)(cookies + (long)(iVar1 % 100) * 8));
printf("Guess the cookie: ");
fflush(stdout);
fgets(local_e8,100,stdin);
sVar3 = strcspn(local_e8,"\n");
local_e8[sVar3] = '\0';
iVar1 = strcmp(local_e8,local_78);
if (iVar1 != 0) {
printf("Wrong. The cookie I wanted was: %s\n",local_78);
/* WARNING: Subroutine does not return */
exit(0);
}
printf("Correct! The cookie was: %s\n",local_78);
fflush(stdout);
}
printf("Congrats!\nFlag: ");
fflush(stdout);
__stream = fopen("flag.txt","r");
if (__stream == (FILE *)0x0) {
perror("Failed to open flag file");
/* WARNING: Subroutine does not return */
exit(1);
}
while( true ) {
iVar1 = fgetc(__stream);
if ((char)iVar1 == -1) break;
putchar((int)(char)iVar1);
}
putchar(10);
fclose(__stream);
fflush(stdout);
if (local_10 != *(long *)(in_FS_OFFSET + 0x28)) {
/* WARNING: Subroutine does not return */
__stack_chk_fail();
}
return 0;
}
2. Exploit
O maior desafio aqui é recriar a lista cookies dentro do script, mas uma vez com isso feito, basta recriar o loop, selecionando os elementos aleatórios da lista e enviando para o programa. Lembre-se de que quando a conexão é remota, a seed deve ser time(NULL) - (algum valor), e se for local, deve ser apenas time(NULL).