salve, premetto che sono nuovo e attualmente sto studiando il linguaccio c, accompagnato dal libro "l'arte dell'hacking".
tuttavia c'è questo programma che in utenza root gira bene, ma se lo eseguo da un qualsiasi altro utente mi da "errore di segmentazione". Il programma è dell'utente root, ma con permessi 'rws', quindi dovrei poterlo eseguire anche con l'utente normale.
il file che viene viene generato grazie ad un altro programma con proprietà di root ma con medesimi permessi 'rws' e la nota ha il permesso 'rw' per il proprietario.
il sorgente è questo:
("libhack" contiene la funzione per uscire se ci sono errori)
tuttavia c'è questo programma che in utenza root gira bene, ma se lo eseguo da un qualsiasi altro utente mi da "errore di segmentazione". Il programma è dell'utente root, ma con permessi 'rws', quindi dovrei poterlo eseguire anche con l'utente normale.
il file che viene viene generato grazie ad un altro programma con proprietà di root ma con medesimi permessi 'rws' e la nota ha il permesso 'rw' per il proprietario.
il sorgente è questo:
("libhack" contiene la funzione per uscire se ci sono errori)
C:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "libhack.h"
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
#define datafile "/home/michael/Scrivania/conv_input/notes"
int stampanote(int, int, char*);
int trova_notau(int, int);
int search_note(char *, char *);
void errore(char *);
int main(int arg, char *argv[]){
int userid, fd, printing = 1;
char cercastring[100];
if(arg > 1)
strcpy(cercastring, argv[1]);
else
cercastring[0] = 0;
userid = getuid();
fd = open(datafile, O_RDONLY);
if(fd == -1)
errore(" errore all'apertura del file");
while(printing)
printing = stampanote(fd, userid, cercastring);
printf("---------end note----------\n");
close(fd);
}
//stampa le note per un determinato id, in caso di stringa di ricerca stampa quella,
//restituendo 0 alla fine del file e 1 se ci sono altre note
int stampanote(int fd, int usid, char *cercastring){
int lungnote;
char nota[100];
lungnote = trova_notau(fd, usid);
if(lungnote == -1) // è la fine del file
return 0;
read(fd, nota, lungnote);
nota[lungnote] = 0;
if(search_note(nota, cercastring))
printf(nota);
return 1;
}
//trova la nota successiva per un id
//restituisce -1 alla fine del file
//altrimenti, restituisce la lunghezza della nota trovata
int trova_notau(int fd, int uid){
int id_nota = -1;
unsigned char byte;
int lunghezza;
while(id_nota != uid){
if(read(fd, &id_nota, 4) != 4)
return -1;
if(read(fd, &byte, 1) != 1)
return -1;
byte = lunghezza = 0;
while(byte != '\n'){
if(read(fd, &byte, 1) != 1)
return -1;
lunghezza++;
}
}
lseek(fd, lunghezza * -1, SEEK_CUR);
printf("[DEBUG] trovati %d byte di nota per l'utente %s\n", lunghezza, id_nota);
return lunghezza;
}
//ricerca una nota in base a una parola chiave
//restituisce 1 in caso di successo
//0 in caso contrario
int search_note(char *note, char *key){
int lkey, match = 0;
lkey = strlen(key);
if(lkey == 0)
return 1;
for(int i = 0; i < strlen(note); i++){
if(note[I] == key[match])
match++;
else{
if(note[I] == key[0])
match = 1;
else
match = 0;
}
if(match == lkey)
return 1;
}
return 0;
}