Beruflich Dokumente
Kultur Dokumente
2NDA EDICIN
HACKING
EL ARTE DE LA EXPLOTACIN
TRADUCIDO POR IVINSON
Crackingvenezolano.blogspot.com
JON ERICKSON
11 10 09 08 07 1 2 3 4 5 6 7 8 9
ISBN-10: 1-59327-144-1
ISBN-13: 978-1-59327-144-2
Autor: William Pollock.
Editores de produccin: Christina Samuell y Megan Dunchak.
Diseo de portada: Octopod Studios.
Editor de Desarrollo: Tyler Ortman
Tcnico Evaluador: Aaron Adams
Editores de copia: Dmitry Kirsanov y Megan Dunchak.
Compositores: Christina Samuell y Kathleen Mish.
Corrector: Jim Brook.
Indexador: Nancy Guenther.
Para obtener informacin sobre los distribuidores de libros o traducciones, por favor
ponte en contacto con No Starch Press, Inc. Directamente:
No Starch Press, Inc.
555 De Haro Street, Suite 250, San Francisco, CA 94107.
Telfono: 415.863.9900; fax: 415.863.9950; info@nostarch.com; www.nostarch.com
Library of Congress Cataloging-in-Publication Data
Erickson, Jon, 1977Hacking: the art of exploitation / Jon Erickson. -- 2nd Ed.
p. cm.
ISBN-13: 978-1-59327-144-2
ISBN-10: 1-59327-144-1
1. Computer security. 2. Computer hackers. 3. Computer networks--Security measures. I. Title.
QA76.9.A25E75 2008
005.8--dc22
2007042910
No Starch Press y el logotipo No Starch Press son marcas registradas de No Starch
Press, Inc. Otros productos y compaas aqu mencionados pueden ser marcas
comerciales de sus respectivos propietarios. En lugar de utilizar un smbolo de marca
comercial con cada aparicin de un nombre de marca registrada, estamos usando los
nombres slo de manera editorial y en beneficio del propietario de la marca, sin
intencin alguna de infraccin de la marca registrada.
La informacin contenida en este libro se distribuye "tal cual", sin garanta. Si bien
todas las precauciones se han tomado en la preparacin de este trabajo, ni el autor ni
No Starch Press, Inc. sern responsables frente a cualquier persona o entidad con
respecto a cualquier prdida o dao causado o presuntamente causado directa o
indirectamente por el la informacin contenida en el mismo.
CONTENIDO BREVE
Prefacio....................................................................................................................... xi
Reconocimientos........................................................................................................ xii
0x100 Introduccin .......................................................................................................1
0x200 Programacin......................................................................................................5
0x300 Explotacin. ...................................................................................................115
0x400 Redes .....................................................................................................195
0x500 Shellcode ......................................................................................................281
0x600 Contramedidas ............................................................................................319
0x700 Criptologa ....................................................................................................393
0x800 Conclusin ....................................................................................................451
ndice.........................................................................................................................455
CONTENIDO DETALLADO
PREFACIO
xi
RECONOCIMIENTOS
xii
0x100 INTRODUCCIN
0x200 PROGRAMACIN
115
195
281
319
0x700 CRIPTOLOGA
393
PREFACIO
RECONOCIMIENTOS
0x100
INTRODUCCIN
sitios Web, y lo peor de todo, sin entender lo que estaban haciendo. Pero muy pocas
personas utilizan este trmino en la actualidad.
La falta de popularidad del trmino puede ser debido a su etimologa confusa cracker originalmente describi a los que rompen los derechos de autor de software y
hacen ingeniera inversa a sistemas de proteccin de copia. Su impopularidad actual
simplemente pudiera derivarse de sus dos nuevas definiciones ambiguas: un grupo de
personas que se involucran en actividades ilegales con computadoras o personas que
son relativamente hackers inexpertos.
Pocos periodistas de tecnologa se sienten obligados a utilizar trminos con los que la
mayora de sus lectores no estn familiarizados. En contraste, la mayora de la gente
es consciente del misterio y la habilidad asociada con el trmino hacker, as que para
un periodista, la decisin de utilizar el trmino hacker es fcil. Del mismo modo, el
trmino script kiddie se utiliza a veces para referirse a los crackers, pero simplemente
no tiene el mismo gusto que el hacker sombro. Hay algunos que todava sostienen
que hay una lnea clara entre hackers y crackers, pero creo que cualquiera que tenga
el espritu hacker es un hacker, a pesar de las leyes que l o ella pueda romper.
Las leyes actuales restringiendo la criptografa y la investigacin criptogrfica opacan
la lnea entre los hackers y los crackers. En 2001, el profesor Edward Felten y su
equipo de investigadores de la Universidad de Princeton estaban a punto de publicar
un artculo que discuta las debilidades de los distintos sistemas de marcas de agua
digitales.
Este documento responde a un desafo lanzado por Secure Digital Music Initiative
(SDMI) en el Reto Pblico de SDMI, lo que alent al pblico para intentar romper
estos esquemas de marcas de agua. Antes de que Felten y su equipo pudieran publicar
el artculo, fueron amenazados tanto por la Fundacin SDMI y Recording Industry
Association of America (RIAA).
Digital Millennium Copyright Act (DCMA) de 1998 establece que es ilegal discutir o
proporcionar tecnologa que pudiera utilizarse para evitar los controles de la industria
de consumo. Esta misma ley fue utilizada contra Dmitry Sklyarov, un programador
informtico ruso y hacker.
Haba escrito software para burlar el cifrado demasiado simplista en el software de
Adobe y present sus conclusiones en una convencin de hackers en los Estados
Unidos. El FBI se abalanz y lo arrestaron, lo que lo llev a una larga batalla legal.
Segn la ley, la complejidad de los controles de la industria de consumo no importaque sera tcnicamente ilegal hacer ingeniera inversa o incluso discutir el Pig Latin si
0x200
PROGRAMACIN
Hacker es un trmino tanto para los que escriben cdigo y
los que lo explotan. A pesar de que estos dos grupos de
hackers tienen diferentes objetivos finales, ambos grupos
utilizan tcnicas de resolucin de problemas similares. Ya
que, la comprensin de la programacin ayuda a los que
explotan, y una comprensin de explotacin ayuda a
quienes programan, muchos hackers hacen ambas cosas. Hay hacks
interesantes que se encuentran tanto en las tcnicas utilizadas para escribir cdigo
elegante y las tcnicas utilizadas en Exploits para programas.
El Hacking es realmente slo el acto de encontrar una solucin inteligente y contraria
a la intuicin de un problema.
Los hacks que se encuentran en Exploits para programas suelen utilizar las reglas de
la computadora para evitar la seguridad en formas nunca previstas. Los hacks de
programacin son similares en que tambin utilizan las reglas de la computadora de
formas nuevas e inventivas, pero el objetivo final es la eficiencia o cdigo fuente ms
pequeo, no necesariamente un compromiso de seguridad. En realidad, hay un
nmero infinito de programas que pueden ser escritos para llevar a cabo una tarea
determinada, pero la mayora de estas soluciones son innecesariamente grandes,
complejas y descuidadas. Las pocas soluciones que quedan son pequeas, eficientes y
ordenadas. Los programas que tienen estas cualidades se dice que tienen la elegancia,
y las soluciones inteligentes e innovadoras que tienden a conducir a esta eficacia, las
cuales se llaman hacks. Los hackers en ambos lados de programacin aprecian la
belleza del cdigo elegante y el ingenio de los hacks inteligentes.
En el mundo de los negocios, se le da ms importancia a la produccin de cdigo
funcional que al logro de la elegancia y hacks inteligentes. Debido al enorme
crecimiento exponencial de la potencia de clculo y la memoria, gastar cinco horas
extras para crear un trozo de cdigo un poco ms rpido y ms eficiente con respecto
a la memoria simplemente no tiene sentido para los negocios cuando se trata de
computadoras modernas que tienen giga Hertz de ciclos de procesamiento y
gigabytes de memoria. Mientras que las optimizaciones de tiempo y memoria van sin
previo aviso por todos excepto el ms sofisticado de los usuarios, una nueva
caracterstica es comercializable. Cuando el resultado final es el dinero, pasar tiempo
en hacks inteligentes para la optimizacin simplemente no tiene sentido.
La verdadera apreciacin de la elegancia de la programacin se deja para los hackers:
aficionados a los ordenadores cuyo objetivo final no es obtener beneficios, sino
exprimir cada pedacito posible de la funcionalidad de su viejo Commodore 64s,
escritores de Exploits que necesitan escribir trozos de cdigo pequeos y
sorprendentes para deslizarse a travs de grietas estrechas de seguridad, y cualquier
persona que aprecie la persecucin y el reto de encontrar la mejor solucin posible.
Estas son las personas que se entusiasman acerca de la programacin y realmente
aprecian la belleza de un trozo de cdigo elegante o la ingenuidad de un hack
inteligente. Ya que la comprensin de la programacin es un requisito previo para
entender cmo los programas pueden ser explotados, la programacin es un punto de
partida natural.
0x210 Qu es la programacin?
La programacin es un concepto muy natural e intuitivo. Un programa no es ms que
una serie de instrucciones escritas en un idioma especfico. Los programas estn en
todas partes, e incluso los tecnfobicos del mundo, usan programas a diario.
Direcciones de manejo, recetas de cocina, juegos de ftbol, y el ADN son todos los
tipos de programas.
Un programa tpico para direcciones de manejo podra ser algo como esto:
------------------------------------------------------------------------------------------------------Comience por la calle principal hacia el este. Contine por la calle principal hasta
que vea una iglesia a su derecha. Si la calle est bloqueada debido a la construccin,
cruce a la derecha all en la calle 15, gire a la izquierda en Pine Street, y luego a la
derecha en la calle 16. De lo contrario, usted puede continuar y girar a la derecha en
la calle 16.
Contine por la calle 16 y gire a la izquierda en la calle de destino. Siga derecho 5
millas por Destination Road, y entonces ver la casa a la derecha.
La direccin es 743 Destination Road.
------------------------------------------------------------------------------------------------------Cualquiera que sepa espaol, puede entender y seguir estas indicaciones para viajar,
ya que estn escritas en espaol. Por supuesto, no es elocuente, pero cada instruccin
es clara y fcil de entender, al menos para alguien que lea espaol.
Pero una computadora no entiende espaol de forma nativa, sino que slo comprende
el lenguaje de mquina. Para indicarle a un ordenador que haga algo, las
instrucciones deben ser escritas en su idioma. Sin embargo, el lenguaje de mquina es
arcano y difcil de trabajar con l - consiste en bits y bytes primos, y es diferente de
arquitectura en arquitectura. Para escribir un programa en lenguaje de mquina para
un procesador Intel x86, tendras que calcular el valor asociado a cada instruccin,
cmo interacta cada instruccin, y una mirada de detalles de bajo nivel.
La programacin de este tipo es laboriosa y engorrosa, y ciertamente no es intuitiva.
Lo que se necesita para superar la complicacin de escribir en lenguaje de mquina es
un traductor. Un ensamblador es una forma de traductor de lenguaje de mquina: es
un programa que traduce el lenguaje ensamblador en cdigo legible por la mquina.
El lenguaje ensamblador es menos crptico que el lenguaje de mquina, ya que utiliza
los nombres de las diferentes instrucciones y variables, en lugar de usar slo
nmeros.
Sin embargo, el lenguaje ensamblador an est lejos de ser intuitivo. Los nombres de
instrucciones son muy esotricos, y el lenguaje es especfico de la arquitectura. As
como el lenguaje mquina para procesadores Intel x86 es diferente al lenguaje
mquina para los procesadores Sparc, el lenguaje ensamblador x86 es diferente al
lenguaje ensamblador de Sparc.
0x220 Pseudo-cdigo
Los programadores tienen todava otra forma de lenguaje de programacin llamado
pseudo-cdigo. Pseudo-cdigo es simplemente ingls arreglado con una estructura
general similar a un lenguaje de alto nivel. No se entiende por los compiladores,
ensambladores u otros equipos, sino que es un modo til para que un programador
organice instrucciones.
El pseudo-cdigo no est bien definido, de hecho, la mayora de la gente escribe
pseudo-cdigo ligeramente diferente. Es una especie de nebulosa en el vnculo
perdido entre lenguajes de programacin en ingls y de alto nivel como C. El pseudocdigo hace una excelente introduccin a los conceptos de programacin comunes
universales.
Las direcciones de manejo de antes pueden volverse a escribir siguiendo esta regla
para producir un trozo de pseudo-cdigo equivalente:
------------------------------------------------------------------------------------------------------Conducir por la calle principal;
If (la calle est bloqueada)
{
Gire a la derecha en la calle 15;
Gire a la izquierda en Pine Street;
Gire a la derecha en la calle 16;
}
Else
{
Gire a la derecha en la calle 16;
}
------------------------------------------------------------------------------------------------------Esta regla acerca de los conjuntos de instrucciones es vlida para todas las estructuras
de control mencionadas en este libro, la cual puede ser descrita en pseudo-cdigo.
------------------------------------------------------------------------------------------------------If (slo hay una instruccin en un conjunto de instrucciones)
El uso de llaves para agrupar las instrucciones es opcional;
Else
{
El uso de llaves es necesario;
Ya que debe haber una manera lgica de agrupar estas instrucciones;
}
------------------------------------------------------------------------------------------------------Incluso la descripcin de una sintaxis puede ser pensada como un programa sencillo.
Hay variaciones de if-then-else, como las instrucciones select / case, pero la lgica
sigue siendo bsicamente la misma: Si esto ocurre, haz estas cosas, de lo contrario
haz otras cosas (que podran consistir en ms sentencias if-then).
Operacin
Smbolo Ejemplo
Suma
Resta
Multiplicacin
Divisin
Reduccin de mdulo
+
*
/
%
b=a+5
b=a-5
b=a*5
b=a/5
b=a%5
Para lograr que un programa utilice estos conceptos, hay que hablar su
lenguaje. El lenguaje C tambin ofrece varias formas abreviadas para estas
operaciones aritmticas. Una de ellas se ha mencionado anteriormente y se
utiliza comnmente en los bucles For.
Expresin completa
Abrev.
Explicacin
i=i+1
i=i-1
i++ o ++i
i-- o --i
Aade 1 a la variable.
Resta 1 a la variable.
i+=12
i-=12
i*=12
i/=12
Condicin
Smbolo
Ejemplo
Menor que
Mayor que
Menor o igual a
Mayor o igual a
Igual a
Diferente a
<
>
<=
>=
==
!=
(a < b)
(a > b)
(a <= b)
(a >= b)
(a == b)
(a != b)
Lgico
OR
AND
Smbolo
||
&&
Ejemplo
((a < b) ||
(a < c))
((a < b) && ! (a < c))
Else
Cruzar(Derecha, Calle 16);
Cruzar (Izquierda, Destination Road);
For (i=0; i<5; i++)
Sigue derecho 1 milla;
Para en Destination Road 743;
------------------------------------------------------------------------------------------------------Las funciones que no son de uso general en pseudo-cdigo, ya que pseudocdigo se utiliza sobre todo como una manera para que los programadores
esbocen conceptos de los programas antes de escribir cdigo compilable. Ya
que el pseudo-cdigo en realidad no tiene que funcionar, las funciones
completas no necesitan ser escritas - hacer cosas complejas aqu ser
suficiente. Pero en un lenguaje de programacin como C, las funciones se
utilizan en exceso. La mayor parte de la utilidad real de C proviene de las
colecciones de funciones existentes llamadas bibliotecas.