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(); }return0;}
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).