07 septiembre 2012

Forense de SQLite VI - Práctica

He creado una base de datos para practicar un poco, lanzar algunas preguntas y sobre la que os animo que hagáis pruebas para luego comprobar los resultados. En el siguiente publicaré  como resolver las dudas. ¡Salvo alguien se anime a mandarlos y publicarlo como contribución! también podéis comentarlos directamente en esta entrada.  El fichero se llama personas.sqlite, es muy sencillo y en el se puede observar casi todo lo comentado en esta serie de entradas.

Las preguntas que ya debemos ser capaces de resolver son:
  1. ¿Qué tamaño tienen las páginas de la base de datos?
  2. ¿Qué versión del motor de base de datos se ha usado?
  3. ¿Cuántas páginas libres tiene?
  4. ¿Cuáles son las hojas de páginas de tablas b-tree? 
  5. ¿Hay hojas overflow?
  6. ¿Qué registro se ha borrado?
  7. ¿Qué otros datos han sido modificados?
  8. ¿Cuánto espacio libre total hay en el fichero?
  9. Comentarios adicionales
Sencillo, ¿no?

Todos las entradas de la serie:

4 comments :

Ivan Nieto dijo...

Mmm, no se si lo he hecho bien, pero creo que puedo tener algunas:


2. 3
6. Robin Hood de los bosques
7.Comentarios de Dick Grayson y Clark kent


Uso OSX y en la primera parte no vi ninguna herramienta para mi plataforma. No hay alguna?

Palako dijo...

Alex, genial la serie, te has pegado un buen curro dejando masticadito for dummies el formato de sqlite, que tiene unos cuantos gotchas de los que te pueden tener horas si no lees con cuidado la specificacion.
Hace tiempo que tenia pensado echar un vistazo a algo asi. Los B-trees no son los arboles mas eficientes, pero son los que mas se usan en BD porque aprovechan la localidad espacial como cache (se balancean menos y cada nodo tiene mas informacion que en un binario balanceado), asi que con lo de que hace mucho que no le metia mano a nada de forense tampoco, me has dado la excusa perfecta para echar unas horas esta noche mirando esto en detalle y matar dos pajaros de un tiro.
Aqui dejo un link a las notas que he ido tomando con las contestaciones a las preguntas que planteas. Te dejo de bonus a la pregunta 9 las 12 operaciones que has realizado para dejar el fichero asi, jejeje. (Spoiler alert! El que no quiera las soluciones que no siga el enlace!)
https://docs.google.com/document/d/1SX3D-Ifflsm48hcairkxNTHtpZ4memSfmYWO0W-_otA/edit



A ver que tal la herramienta que te has currado, porque haciendo esto se me han ocurrido un par de ideas sencillas de implementar que pueden quedar muy chulas.


Saludos y gracias de nuevo por la serie! Mas de esto!!

Alejandro Ramos dijo...

Lo he estado leyendo y es genial !! Enhorabuena por el currazo !! Lastima que no hayamos podido publicarlo

Marcos Agüero Rodríguez dijo...

Un detalle aleatorio sobre este documento. En el punto 6 dice:
'En la pagina 2 parece haber una celda borrada en el offset 0x20. Los primeros bytes (dedicados al tamaño del payload, identificador de fila y tamaño de la cabecera del payload estan a 0
Esto es debido a que cuando se borra un registro en sqlite ese trozo se marca como "fragmento". En el offset 7 de la cabecera de la pagina BTree tenemos el número de fragmentos (espacios libres de más de 4 bytes entre celdas). En cada fragmento, en los primeros 4 bytes se escribe el offset del siguiente fragmento y el tamaño de ese fragmento en la página. Volviendo a la solucion:
$ xxd -s `echo -e "ibase=16\n400+20"|bc` -l 10 -p personas.sqlite0000006e171529199019
0x0000 = indica que no hay más fragmentos.
0x006e = 110, lo que significa que ese fragmento ocupa 110 bytes, por eso no tiene sentido al intentar interpretarlo como tamaño del payload