Domanda programma in c che legge le note con chsh, problema!

The King of BlackOut

Utente Bronze
21 Ottobre 2020
36
11
7
27
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)
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;
}
 
Si solito i problemi di permissions non si manifestano con un segfault, anche se visto l'utilizzo dei puntatori, in questo caso potrebbe essere.
Comunque hai tutti gli strumenti per fare un debug del tuo programma, quindi perchè non lo fai? Potresti ustilizzare anche strace per vedere in che punto si blocca.
 
Si solito i problemi di permissions non si manifestano con un segfault, anche se visto l'utilizzo dei puntatori, in questo caso potrebbe essere.
Comunque hai tutti gli strumenti per fare un debug del tuo programma, quindi perchè non lo fai? Potresti ustilizzare anche strace per vedere in che punto si blocca.
perchè di solito ho fatto solo qualche debugg seguendo il libro ma non ho capito a pieno come usare questo strumento. ho usato gdb ma sarà anche perchè è spiegato almeno per me un po' male nel libro
 
Ultima modifica:
ciao, intanto ti ringrazio del tuo aiuto, qui c'è l'output
, se puoi e soprattutto se vuoi e capisci il problema potresti spiegarmelo? non mi interessa tanto la soluzione in se ma capire il problema:


Codice:
strace ./searchnote
execve("./searchnote", ["./searchnote"], 0x7fffce953990 /* 39 vars */) = 0
access("/etc/suid-debug", F_OK)         = -1 ENOENT (File o directory non esistente)
brk(NULL)                               = 0x558982276000
fcntl(0, F_GETFD)                       = 0
fcntl(1, F_GETFD)                       = 0
fcntl(2, F_GETFD)                       = 0
access("/etc/suid-debug", F_OK)         = -1 ENOENT (File o directory non esistente)
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (File o directory non esistente)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=96583, ...}) = 0
mmap(NULL, 96583, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f8768361000
close(3)                                = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260A\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1824496, ...}) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f876835f000
mmap(NULL, 1837056, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f876819e000
mprotect(0x7f87681c0000, 1658880, PROT_NONE) = 0
mmap(0x7f87681c0000, 1343488, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x22000) = 0x7f87681c0000
mmap(0x7f8768308000, 311296, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x16a000) = 0x7f8768308000
mmap(0x7f8768355000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1b6000) = 0x7f8768355000
mmap(0x7f876835b000, 14336, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f876835b000
close(3)                                = 0
arch_prctl(ARCH_SET_FS, 0x7f8768360500) = 0
mprotect(0x7f8768355000, 16384, PROT_READ) = 0
mprotect(0x55898033f000, 4096, PROT_READ) = 0
mprotect(0x7f87683a0000, 4096, PROT_READ) = 0
munmap(0x7f8768361000, 96583)           = 0
getuid()                                = 1000
openat(AT_FDCWD, "/home/michael/Scrivania/conv_input/notes", O_RDONLY) = -1 EACCES (Permesso negato)
dup(2)                                  = 3
fcntl(3, F_GETFL)                       = 0x8002 (flags O_RDWR|O_LARGEFILE)
brk(NULL)                               = 0x558982276000
brk(0x558982297000)                     = 0x558982297000
fstat(3, {st_mode=S_IFCHR|0620, st_rdev=makedev(0x88, 0), ...}) = 0
write(3, " !!Errore: uscita errore all'ape"..., 67 !!Errore: uscita errore all'apertura  del file: Permission denied
) = 67
close(3)                                = 0
exit_group(-1)                          = ?
+++ exited with 255 +++
Messaggio unito automaticamente:

ho provato ad usare gdb(con strace ci ho provato ma è stata la prima volta che lo usavo) e ho notato che nonostante il permesso che ho applicato sul programma, dovrei usarlo come root ma a programma eseguito l'id con cui si esegue è sempre quello dell'utente normale e non riesco a capire perchè dato che il permesso l'ho abilitato