<aside> đźš©
C’è un controllo di sicurezza che impedisce al programma di continuare a eseguire codice se l’utente che lo invoca non matcha uno specifico user id
</aside>
Gli obiettivi della sfida sono:
/home/flag13/flag13
/bin/getflag
come utente flag13#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <string.h>
#define FAKEUID 1000
int main(int argc, char **argv, char **envp){
int c;
char token[256];
if(getuid() != FAKEUID) {
printf("Security failure detected. UID %d started us, we expect %d\\n", getuid(), FAKEUID);
printf("The system administrators will be notified of this violation\\n");
exit(EXIT_FAILURE);
}
// snip, sorry :)
printf("your token is %s\\n", token);
}
L’utente può accedere alla directory /home/flag13
che contiene file di configurazione di bash e un eseguibile /home/flag13/flag13
Digitando ls -la /home/flag13/flag13
otteniamo -rwsr-x--- 1 flag13 level13
→ il file flag13 è di proprietà di flag13, è eseguibile dagli utenti del gruppo level13 ed è SETUID
LD_*
Alcune variabili d’ambiente tra cui LD_LIBRARY_PATH
e LD_PRELOAD
possono influenzare il comportamento del linker dinamico → parte del SO che carica e linka le librerie condivise necessarie a un eseguibile a runtime
LD_PRELOAD
Contiene un elenco di librerie condivise (shared object) separato da :
che sono collegate prima di tutte le altre richieste durante l’esecuzione di un eseguibile
Viene utilizzata per ridefinire dinamicamente alcune funzioni senza dover ricompilare i sorgenti