lunes, febrero 28, 2005

Informe PFC 28/2/2005

CONCEPTOS/NOMENCLATURA

- Protegir --> DESACTIVAR
- Pàgines ACTIVES, quantitat de memória màxima.

TASQUES

1) Mirar utilitats semblants --> strace, ...
2) Vector de pàgines ACTIVES no ha de ser FIFO:
- Tenint en compte l'EIP no desactivar el codi que s'està executant.
3) Mirar si les proteccions estàn com han d'estar.
4) Obtenir informació (bits) de les pàgines: referències, estan a memòria? Sticky bit? --> Interaccions amb accions de MEMORY MANAGEMENT del SO
5) Parar l'execució si hi ha comportament no esperat:
- Hi ha excepció a una pàgina ja activada.
6) Retorn de l'exepció --> retornar true/false en funció de si ha solucionat l'exepció o no, per posiblement pasar-li al S.O.

IDEES

- Volem LIMITAR/CONTROLAR la quantitat de memòria, pensant en entorns empotrats.
- Potser no podem fer un free de pàgines referenciades a mode usuari.

domingo, febrero 27, 2005

PFC 27/02/2005

Mañana:
- Acabar estudio + copia seguridad del proyecto.
- Find and take uLibc usefull functions.
- Funciones necesarias:
- fopen --> open
- mprotect
- sigaction
- fseek
- fgets
- sscanf
- getpid
- getenv
- mmap
- fclose --> close
- write
- Hacer que funcione siempre el programa:
- mirar la rutina de atencion a la excepcion anterior. Se ha observado que no hay ninguna.

martes, febrero 15, 2005

Acceder a la tabla con las posiciones en memória donde el loader carga las librerias

El loader tiene una tabla (_rtld_global), que está definida en el archivo ldsodefs.h (/sysdeps/generic/). En ejecución lo encontramos en /lib/ld-linux.so:

readelf -s /lib/ld-linux.so.2 | grep _rtld_global
8: 00016000 1080 OBJECT GLOBAL DEFAULT 16 _rtld_global@@GLIBC_PRIVATE
24: 00015ca0 460 OBJECT GLOBAL DEFAULT 13 _rtld_global_ro@@GLIBC_PRIVATE

Para encontrar este código hemos partido de la función dl_open, definida como _dl_open (/elf/dl-open.c), hemos ido siguiendo la ejecución para ver dónde cojia la tabla con las posiciones en memória de las librerias. El recorrido ha sido:

dl-open.c: _dl_open() : errcode = _dl_catch_error (&objname, &errstring, dl_open_worker, &args);
dl-error.c: _dl_catch_error() :(*operate) (args);
dl-open.c: dl_open_worker() : GL(dl_loaded)
ldsodefs.h: # define GL(name) _rtld_global._##name

codigo C ...

Tip 1:

# define GL(name) _rtld_global._##name

Si llamamos a GL(nombre_pro) es como si llamasemos a _rtld_global._nombre_pro

Tip 2:

Declaramos:

funcion_A ( ..., void (*operate) (void *), ...)

Si hacemos:

(*operate) (args)

Llamamos a la función que hemos pasado como parámetro en funcion_A con los argumentos "args", esta función tendra un solo argumento (void *).

jueves, febrero 03, 2005

Informe PFC 3/2/2005

Carga dinámica de páginas en Modo Usuario:

Hacer lo mismo que con libpftrace, pero en vez de protejer la página, hacer free(), si hay excepción, hacer mmap() de la página.

1) Hacerlo con código.
2) Hacerlo con datos --> guardarlos en ficherlos temporales, y ir haciendo mmap(), flush(), free(), mmap() ...

libPFTrace: Páginas que se protegen al iniciar el proceso

Situción: Al cargar el programa en memoria libpftrace protege todas las páginas exceptuando las necesarias para que no se produzcan excepciones que no podamos controlar.

Problema: Determinar el conjunto mínimo de páginas que hemos de protejer para que en cualquier sistema funcione libpftrace.

Notas:
- En algún sistema funciona tal qual en otros hay que añadir páginas a la restricción para que funcione.
- La dirección de la pila es diferente en función del sistema.

Ideas:
- Comprobar donde se encuentran las variables que se utilizan.

Código:

if (
!(((void *)&pftrace_catch_acces_violation_trace2 > (void *)add1) && ((void *)add2 > (void *)&pftrace_catch_acces_violation_trace2))
&& !(((void *)pftrace_page_range > (void *)add1) && ((void *)add2 > (void *)pftrace_page_range))
&& !(((void *)&pftrace_page_range > (void *)add1) && ((void *)add2 > (void *)&pftrace_page_range))
&& !(((void *)&pftrace_page_range_len > (void *)add1) && ((void *)add2 > (void *)&pftrace_page_range_len))
&& !(((void *)&mprotect > (void *)add1) && ((void *)add2 > (void *)&mprotect))
&& !((sscanf(pftrace_page_range[iAnt].name, "/%s/libPFC.so.1.0.1",name) ==1) && (pftrace_page_range[i].prots == (PROT_READ | PROT_WRITE)))
&& !((sscanf(name, "/lib/libc-%s",name) ==1) && (pftrace_page_range[i].prots == (PROT_READ | PROT_WRITE)))
&& !((sscanf(pftrace_page_range[iAnt].name, "/lib/libc-%s",name) ==1) && (pftrace_page_range[i].prots == (PROT_READ | PROT_WRITE)))
&& !(add1 > 0xbfff0000) // pila
&& !(sscanf(name, "/lib/libpthread-%s",name) == 1)
&& ((void *)add1 != pftrace_ini_shmem_global) //No proteigim la shared memory.
// TEMPORALMENT no protegim printf!!! (debug)
&& !(((void *)&printf > (void *)add1) && ((void *)add2 > (void *)&printf))
)
{
mprotect((void *)add1, add2-add1, PROT_NONE);
pftrace_page_range[i].protected = 1;
escribir_traza()
}