jueves, marzo 31, 2005

Reunion 30/3/2005

- redefinir __syscall_return(a,b) --> aixi no depenem d'errno . (podem confondre al sistema pq estem modificant errno y despres ho pot consultar el programa q executem).

__cxa_finalize --> com son weak les podem redefinir (fent-les strong).

- fer strtol c[i] -'0' ...

- pftrace_open inicialitzar el mode a un valor.

- Fer fitxer de configuració amb les libreries que no s'han de carregar a memória y amb les opcions de configuracio.

- Agafar adreces a la libc de les funcions que redefinim (sigaction, dlopen...).

- Fer unes pagines del manual --> amb comparació utilitats similar (electricfence, pstack, dmalloc, memprof).

TEST:
Dos tipus:
1) provar que el programa funciona
2) provar que funcionara a un sistema --> desitjable donar pistes de pq no funcionarà:
- Mirar on es carreguen les dades inicialitzades, dades no ini, dades anonimes, codi de les llibreries. --> Fer .so's que serveixin de test. (aixi podem demostrar si podem correr a un sistema o no).

NOTES:

- dlsym ---> dona l'addresa de la funcio x a la llibreria y, podem fer calls a les funcions de les llibreries que volguem

- ld prepara __environ abans de carregar les funcions init de les llibreries.

PARAULES:
Stub --> es per anomenar el que he fet amb les system calls.

martes, marzo 29, 2005

Test a fer per a libptrace

Test 1: Provar la llibreria amb un programa que no càpiga a memória. --> Veurem el comportament de la llibreria al descarregar de memoria pàgines protegides.

Test 2: Accesos a @ ilegals (posicio q no existeix al rang del programa).

Test 3: Varios threads

Test 4: dlopen(), dlclose(), sigaction()

viernes, marzo 18, 2005

linux-gate.so.1

Today I noticed about that strange library "linux-gate.so.1" because when I make:

ldd libpftrace.so.1.0.1

It shows:

linux-gate.so.1 => (0xffffe000)
libc.so.6 => /lib/libc.so.6 (0xb7ed8000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x80000000)


I investigate and found that is a dynamically shared object (DSO) for
system call purposes (e.g., to speed up system calls and for signal
trampoline/sigreturn purposes).

More info:
http://www.uwsg.iu.edu/hypermail/linux/kernel/0306.2/0674.html

jueves, marzo 17, 2005

INFORME 17/3/2005

1) Fer syscalls en comptes de crides a libc: mirar els flags de gcc que s'utilizen al compilar amb llibreries del sistema (compilar uClibc).

2) Pensar i fer petits programes de test:
- agafa moltes memoria de manera q paginem
- @ ilegals (posicio q no existeix)
- ...

3) Descarregar/carregar de memória págines --> fer free?.

4) Mirar UserModeLinux.

martes, marzo 15, 2005

Como llamar a funciones del sistema sin pasar por libc

En el subdirectorio /usr/src/linux/include/asm-ARQUITECTURA (ej: /usr/src/linux/include/asm-i386/) existe el archivo unistd.h, donde estan definidos los codigos de entrada a cada función del sistema:

...
#define __NR_chmod 15
#define __NR_lchown 16
#define __NR_break 17
#define __NR_oldstat 18
#define __NR_lseek 19
#define __NR_getpid 20
#define __NR_mount 21
#define __NR_umount 22
...

Y las funciones para llamarlas en función de los parámetros que de esa función:

#define _syscall0(type,name) type name(void) { long __res; __asm__ volatile ("int $0x80" : "=a" (__res) : "0" (__NR_##name)); __syscall_return(type,__res); }

...

#define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, type5,arg5,type6,arg6) type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5,type6 arg6) { long __res; __asm__ volatile ("push %%ebp ; movl %%eax,%%ebp ; movl %1,%%eax ; int $0x80 ; pop %%ebp" : "=a" (__res) : "i" (__NR_##name),"b" ((long)(arg1)),"c" ((long)(arg2)), "d" ((long)(arg3)),"S" ((long)(arg4)),"D" ((long)(arg5)), "0" ((long)(arg6))); __syscall_return(type,__res); }

De esta manera, para llamar a la función del sistema directamente se necesita el siguiente código:

#include <sys/syscall.h>

_syscall0(pid_t, __NR_getpid);

Hay funciones de sistema que necesitan un tratamiento de los parametros antes de hacer el syscall, como por ejemplo sigaction, open y mmap.

sábado, marzo 12, 2005

saturday 12th March

Pruebas realizadas

Se puede proteger:
-ld
NO se puede proteger:
- libpthread
- páginas "0".

Si protegemos ld, la ejecución de find no funciona correctamente.

Notas

Cuidado al tratar los rangos de páginas a partir de /proc/maps porque la página de final de rango no se incluye:
40000000-40012000 r-xp /lib/ld-2.3.4.so
va de 40000000 a 40011999 !!

miércoles, marzo 09, 2005

INFORME 9/3/2005

TASKS:

1) Shell Script PFTRACE: Posar devant totes les opcions aixi deixem el que hi ha al final com a executable. --> There's a correct version that works, leaving this task.
2) Per minimitzar encara més les crides a libc --> copiar el codi en assembler de les funcions mprotect, sigaction, mmap, write, open, close, ... per no cridar la libc (mirar-ho a partir de ulibc).
3) Modificacions a conditions for finish execution of pftrace.
4) Si hi ha algún error y deixem de el control totalment, llavorns no l'hem de deixar al fer el destruct (my_fini()).
5) Provar de no protegir ld ni libc a veure que pasa.
6) Provar la llibreria amb un programa que no càpiga a memòria.


CONCEPTOS/NOMENCLATURA

Les seccions (págines) del mmap amb que treballem son CONTROLADES, les que no són NO CONTROLADES.

Cross Compiling with Gentoo

jueves, marzo 03, 2005

Conditons for finish the execution of pftrace


- Requested page isn't in page table (error = 1)
- mprotect error:
- when activating (error = 2)
- when unactivating (error = 3)
- Requested page por activation is already active (error = 4)
- Controlar si la exepció va cap a una pàgina controlada, sino error = 5.
- Error al llegir /proc/PID/maps --> error = 6.
- Mateix EIP PFTRACE_MAX_REPET_EIP cops --> error = 7.
- El número de pàgines a memoria es més gran que pftrace_MAX_PAGES_UNPROT (les estructures que guarden les dades de profiling es surten de rang)--> error = 8.

miércoles, marzo 02, 2005

work done

1) Actualization of the unprotected pages vector index (in order to make it work like a FIFO cue with some exceptions). Exceptions:
- If the new unactive page is the one that is in execution (== EIP page).

// If the selected page for unactivation is the same as the one in execution, we choose another
// if there's (it would)
for( i = 0; ( (actual_eip & 0xFFFFF000) == (0xFFFFF000 & (long) pftrace_last_access [pftrace_actual_v_pos]) )
&& (i <>
pftrace_actual_v_pos = (pftrace_actual_v_pos +1) % pftrace_NUM_PAGES_IN_MEM;

This make me take notice that weren't giving the correct protections (rw, rx, ...) when activating pages

2) Creation of pftrace_exception_finish() intended to be called when something strange occures, then we restore the previous execution and finish our work.