Вы находитесь на странице: 1из 42

HACKING: EL ARTE DE LA EXPLOTACIN 2NDA EDICIN Traducido por Ivinson 2012

Traductor: Ivinson - @IvinsonCLS

HACKING: EL ARTE DE LA EXPLOTACIN 2NDA EDICIN Traducido por Ivinson 2012

CRTICAS CONSTRUCTIVAS PARA LA PRIMERA EDICIN DE


HACKING: EL ARTE DE LA EXPLOTACIN

El tutorial ms completo en tcnicas de Hacking. Finalmente, un libro que no slo


muestra cmo utilizar los Exploits, sino cmo desarrollarlos.
-PHRACK
De todos los libros que he ledo hasta ahora, considerara este manual de Hackers
seminal.
-SECURITY FORUMS
Recomiendo este libro slo por la seccin de programacin.
-UNIX REVIEW
Yo recomiendo este libro. Est escrito por alguien que sabe de lo que dice, con
cdigo til, herramientas y ejemplos.
-IEEE CIPHER
El libro de Erickson es una gua compacta y lgica para los hackers novatos, est
lleno de cdigo real, tcnicas de Hacking y explicaciones de cmo que trabajan.
- COMPUTER POWER USER (CPU) MAGAZINE
ste es un libro excelente. Aquellos que estn dispuestos a pasar al [siguiente nivel]
deberan tener este libro y leerlo a fondo.
- ABOUT.COM INTERNET/NETWORK SECURITY

Traductor: Ivinson - @IvinsonCLS

HACKING: EL ARTE DE LA EXPLOTACIN 2NDA EDICIN Traducido por Ivinson 2012

Traductor: Ivinson - @IvinsonCLS

HACKING: EL ARTE DE LA EXPLOTACIN 2NDA EDICIN Traducido por Ivinson 2012

2NDA EDICIN

HACKING
EL ARTE DE LA EXPLOTACIN
TRADUCIDO POR IVINSON
Crackingvenezolano.blogspot.com

JON ERICKSON

Traductor: Ivinson - @IvinsonCLS

HACKING: EL ARTE DE LA EXPLOTACIN 2NDA EDICIN Traducido por Ivinson 2012

Copyright 2008 por Jon Erickson.


Todos los derechos reservados. Ninguna parte de este documento puede ser
reproducida o transmitida en cualquier forma o por cualquier medio, ya sea
electrnico o mecnico, incluyendo el fotocopiado, grabacin o por cualquier sistema
de almacenamiento o recuperacin de informacin sin el previo permiso escrito del
propietario del derecho de autor y el editor.

Impreso en papel reciclado en los Estados Unidos de Amrica.

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.

Traductor: Ivinson - @IvinsonCLS

HACKING: EL ARTE DE LA EXPLOTACIN 2NDA EDICIN Traducido por Ivinson 2012

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.

Traductor: Ivinson - @IvinsonCLS

HACKING: EL ARTE DE LA EXPLOTACIN 2NDA EDICIN Traducido por Ivinson 2012

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

Traductor: Ivinson - @IvinsonCLS

HACKING: EL ARTE DE LA EXPLOTACIN 2NDA EDICIN Traducido por Ivinson 2012

CONTENIDO DETALLADO

PREFACIO

xi

RECONOCIMIENTOS

xii

0x100 INTRODUCCIN

0x200 PROGRAMACIN

0x210 Qu es la programacin? .............................................................. 6


0x220 Pseudo-cdigo.................................................................................. 7
0x230 Estructuras de Control ..................................................................... 8
0x231 If-Then-Else....................................................................................... 8
0x232 Bucles While/Until ............................................................................. 9
0x233 Bucles For ......................................................................................... 10
0x240 Ms conceptos fundamentales de programacin ............................ 11
0x241 Variables .......................................................................................... 11
0x242 Operadores Aritmticos.................................................................... 12
0x243 Operadores de Comparacin........................................................... 14
0x244 Funciones ........................................................................................ 16
0x250 Metiendo los Pies al Barro ............................................................... 19
0x251 La Imagen ms Grande .................................................................... 20
0x252 El Procesador x86 ......................................................................... 23
0x253 Ensamblador ....................................................................... 25
0x260 Regresando a lo Bsico .................................................................... 37
0x261 Strings ............................................................................................... 38
0x262 Signed, Unsigned, Long, y Short .................................................. 41
0x263 Punteros .. ........................................................................................ 43
0x264 Formatos de Strings .......................................................................... 48
0x265 Typecasting o Conversin de Tipo .................................................. 51
0x266 Argumentos de Lnea de Comandos ................................................. 58
0x267 Enfoque de Variables ........................................................................ 62
0x270 Segmentacin de Memoria ............................................................... 69
0x271 Segmentos de Memoria en C ............................................................ 75
0x272 Usando el Heap ................................................................................. 77
0x273 Chequeo de Errores con malloc() ...................................................... 80
0x280 Construyendo lo Bsico ..................................................................... 81
0x281 Acceso a Archivos ............................................................................. 81

Traductor: Ivinson - @IvinsonCLS

HACKING: EL ARTE DE LA EXPLOTACIN 2NDA EDICIN Traducido por Ivinson 2012

0x282 Permisos de Archivos ........................................................................ 87


0x283 IDs de Usuarios .............................................................................. 88
0x284 Estructuras ........................................................................................ 96
0x285 Punteros de Funciones .................................................................... 100
0x286 Nmeros Pseudo-random ............................................................... 101
0x287 Un juego de azar ...................................................................... 102
0x300 EXPLOTACIN

115

0x310 Tcnicas Generalizadas de Exploits ............................................... 118


0x320 Desbordamiento de Buffer .............................................................. 119
0x321 Vulnerabilidades del Desbordamiento de Buffer ................. 122
0x330 Experimentando con BASH ............................................................. 133
0x331 Usando el Entorno .................................................................... 142
0x340 Desbordamientos en Otros Segmentos .......................................... 150
0x341 Un Desbordamiento de Heap Bsico .............................................. 150
0x342 Desbordando Punteros de Funciones ............................................ 156
0x350 Formato de Strings .......................................................................... 167
0x351 Parmetros de Formato ................................................................... 167
0x352 La Vulnerabilidad de Formato de Strings ........................................ 170
0x353 Leyendo Direcciones de Memoria Arbitrarias ................................. 172
0x354 Escribiendo en Direcciones de Memoria Arbitrarias ........................ 173
0x355 Acceso a Parmetros Directos ........................................................ 180
0x356 Usando Escrituras Cortas ................................................................ 182
0x357 Desvos con .dtors............................................................................ 184
0x358 Otra Vulnerabilidad de Notesearch ................................................. 189
0x359 Sobrescribiendo la Tabla Global de Offsets .................................... 190
0x400 REDES

195

0x410 ModelO OSI ..................................................................................... 196


0x420 Sockets ............................................................................................ 198
0x421 Funciones del Socket ...................................................................... 199
0x422 Direcciones del Socket ................................................................... 200
0x423 Orden de Bytes de Red ................................................................... 202
0x424 Conversin de Direcciones de Internet ........................................... 203
0x425 Un Ejemplo de un Servidor Sencillo ................................................ 203
0x426 Un Ejemplo de Cliente Web ............................................................ 207
0x427 Un Servidor Tinyweb ...................................................................... 213
0x430 Quitando las capas Inferiores .......................................................... 217
0x431 Capa de Enlace de Datos .............................................................. 218

Traductor: Ivinson - @IvinsonCLS

HACKING: EL ARTE DE LA EXPLOTACIN 2NDA EDICIN Traducido por Ivinson 2012

0x432 Capa de Red ... ............................................................................ 220


0x433 Capa de Transporte ......................................................................... 221
0x440 Sniffing en la Red ............................................................................ 224
0x441 Sniffer Tipo Raw Socket .............................................................. 226
0x442 Sniffer Tipo libpcap ......................................................................... 228
0x443 Decodificando las Capas ................................................................. 230
0x444 Sniffing Activo .............................................................................. 239
0x450 Denegacin de Servicio .............................................................. 251
0x451 SYN Flooding ............................................................................. 252
0x452 El Ping de la Muerte ................................................................... 256
0x453 Lgrima .................................................................................... 256
0x454 Ping Flooding ............................................................................. 257
0x455 Ataques de Amplificacin ........................................................... 257
0x456 DoS Flooding Distribuido.............................................................. 258
0x460 Secuestrando TCP/IP .................................................................. 258
0x461 Secuestrando RST ...................................................................... 259
0x462 Continuando con el Secuestro .................................................... 263
0x470 Escaneo de Puertos .................................................................... 264
0x471 Escaneo Stealth SYN .................................................................. 264
0x472 Escaneo FIN, X-mas, y Null.......................................................... 264
0x473 Seuelos de Suplantacin ........................................................... 265
0x474 Idle Scanning.............................................................................. 265
0x475 Defensa Proactiva (Sudario) ....................................................... 267
0x480 Hackea a Alguien .................................................................. 272
0x481 Anlisis con GDB ....................................................................... 273
0x482 Casi solo cuenta con Granadas de Mano ..................................... 275
0x483 Port-Binding Shellcode ........ 278
0x500 SHELLCODE

281

0x510 Ensamblador vs. C ......................................................................... 282


0x511 Llamadas al Sistema de Linux en ASM .......................................... 284
0x520 El Camino a la Shellcode ............................................................... 286
0x521 Instrucciones ASM Usando la Pila . ............................................ 287
0x522 Investigando con GDB ................................................................. 289
0x523 Quitando los Bytes Nulos ................................................................ 290
0x530 Shell-Spawning Shellcode ............................................................... 295
0x531 Un Tema de Privilegio ..................................................................... 299
0x532 Y Ms Pequeo An ....................................................................... 302
0x540 Port-Binding Shellcode .................................................................... 303
0x541 Duplicando Descriptores de Archivo Estndar ................................ 307

Traductor: Ivinson - @IvinsonCLS

HACKING: EL ARTE DE LA EXPLOTACIN 2NDA EDICIN Traducido por Ivinson 2012

0x542 Ramificando Estructuras de Control ................................................ 309


0x550 Connect-Back Shellcode ................................................................. 314
0x600 CONTRAMEDIDAS

319

0x610 Contramedidas que Detectan ......................................................... 320


0x620 System Daemons............................................................................. 321
0x621 Curso Intensivo de Seales ............................................................ 322
0x622 Tinyweb Daemon ........................................................................ 324
0x630 Herramientas del oficio ................................................................ 328
0x631 Herramienta de Exploit para Tinyweb ......................................... 329
0x640 Archivos de Registro ................................................................... 334
0x641 Mezclndose con la multitud ....................................................... 334
0x650 Mirando lo Obvio ...................................................................... 336
0x651 Un Paso a la Vez ..................................................................... 336
0x652 Poniendo las Cosas como estaban ............................................. 340
0x653 Trabajadores Infantiles ................................................................ 346
0x660 Camuflaje Avanzado ................................................................... 348
0x661 Suplantando la Direccin IP Guardada (Spoofing) ..................... 348
0x662 Explotacin sin Registro .............................................................. 352
0x670 La Infraestructura Completa ........................................................ 354
0x671 Reutilizacin del Socket .............................................................. 355
0x680 Contrabando de Payloads ............................................................ 359
0x681 Codificando Strings ...................................................................... 359
0x682 Cmo Ocultar una Secuencia ...................................................... 362
0x690 Restricciones del Buffer ............................................................... 363
0x691 Shellcode ASCII Polimrfica e imprimible ................................... 366
0x6a0 Reforzando las Contramedidas .................................................. 376
0x6b0 Pila no Ejecutable ........................................................................ 376
0x6b1 ret2libc .......................................................................................... 376
0x6b2 Retornando a system().................................................................. 377
0x6c0 Espacio de Pila Randomizada ...................................................... 379
0x6c1 Investigaciones con BASH y GDB ................................................ 380
0x6c2 Rebotando en la Puerta de Linux ................................................ 384
0x6c3 Conocimiento Aplicado ................................................................. 388
0x6c4 Un Primer Intento .......................................................................... 388
0x6c5 Jugando con las probabilidades ................................................... 390

Traductor: Ivinson - @IvinsonCLS

HACKING: EL ARTE DE LA EXPLOTACIN 2NDA EDICIN Traducido por Ivinson 2012

0x700 CRIPTOLOGA

393

0x710 Teora de la Informacin ................................................................ 394


0x711 Seguridad Incondicional ................................................................. 394
0x712 One-Time Pads o Libretas de un Solo Uso ..................................... 395
0x713 Distribucin de Clave Cuntica ....................................................... 395
0x714 Seguridad Computacional ............................................................ 396
0x720 Tiempo de ejecucin algortmica ..................................................... 397
0x721 Notacin asinttica ...................................................................... 398
0x730 Encriptacin Simtrica ..................................................................... 398
0x731 Algoritmo Cuntico de Bsqueda de Lov Grover ............................ 399
0x740 Encriptacin Asimtrica ................................................................... 400
0x741 RSA ................................................................................................. 400
0x742 Algoritmo Cuntico de Factorizacin de Peter Shor ....................... 404
0x750 Cifrados Hbridos .......................................................................... 406
0x751 Ataques Man-in-the-Middle ............................................................ 406
0x752 Diferenciando Los Fingerprints del Host del Protocolo SSH .......... 410
0x753 Fingerprints Confusas ..................................................................... 413
0x760 Crackeando Contraseas ............................................................... 418
0x761 Ataque por Diccionario ................................................................... 419
0x762 Ataques Exhaustivos de Fuerza Bruta .......................................... 422
0x763 Tabla de bsqueda de Hashes ........................................................ 423
0x764 Matriz de Probilidades de Contrasea .......................................... 424
0x770 Encriptacin inalmbrica 802.11b ................................................. 433
0x771 Privacidad equivalente por cable ................................................... 434
0x772 RC4 Stream Cipher o Cifrado de Flujo RC4 ................................. 435
0x780 Ataques WEP ............................................................................... 436
0x781 Ataques de Fuerza Bruta Offline .................................................. 436
0x782 Reutilizacin de Keystream .......................................................... 437
0x783 Tablas de Diccionarios de Desencriptacin Tipo IV ..................... 438
0x784 Redireccin de IP............................................................................ 438
0x785 Ataques Fluhrer, Mantin, y Shamir ................................................. 439
0x800 CONCLUSIN 451
0x810 Referencias ..................................................................................... 452
0x820 Fuentes ........................................................................................... 454
NDICE

Traductor: Ivinson - @IvinsonCLS

HACKING: EL ARTE DE LA EXPLOTACIN 2NDA EDICIN Traducido por Ivinson 2012

PREFACIO

El objetivo de este libro es compartir el arte del Hacking


con todo el mundo. Comprender las tcnicas de Hacking es
a menudo difcil, ya que requiere tanto la amplitud y
profundidad de los conocimientos. Muchos textos de
Hacking parecen esotricos y confusos por causa de tan slo unos pocos
fallos en esta educacin de pre-requisito.
Esta segunda edicin de Hacking: El Arte de la Explotacin hace que el mundo del
Hacking sea ms accesible, proporcionando la imagen completa, desde la
programacin en cdigo mquina a la explotacin. Adems, esta edicin cuenta con
un LiveCD basado en Ubuntu-Linux que puede ser utilizado en cualquier
computadora con un procesador x86, sin modificar el sistema operativo existente en
el equipo. Este CD contiene todo el cdigo fuente del libro y proporciona un entorno
de desarrollo y explotacin que puedes utilizar para seguir junto con ejemplos del
libro y experimentar a lo largo del camino.

Traductor: Ivinson - @IvinsonCLS

HACKING: EL ARTE DE LA EXPLOTACIN 2NDA EDICIN Traducido por Ivinson 2012

RECONOCIMIENTOS

Me gustara dar las gracias a Bill Pollock y todos los dems


en No Starch Press por hacer de este libro una posibilidad y
permitirme tener un control creativo en el proceso. Adems, me
gustara agradecer a mis amigos Seth Benson y Aaron Adams por la revisin y
edicin, Jack Matheson por ayudarme con ASM, El Dr. Seidel por mantenerme
interesado en la ciencia de la informtica, mis padres por comprar ese primer
Commodore VIC-20, y la comunidad Hacker por la innovacin y la creatividad que
produjo las tcnicas explicadas en este libro.

Traductor: Ivinson - @IvinsonCLS

HACKING: EL ARTE DE LA EXPLOTACIN 2NDA EDICIN Traducido por Ivinson 2012

0x100
INTRODUCCIN

La idea del Hacking puede evocar imgenes estilizadas de


vandalismo electrnico, el espionaje, el pelo teido y
perforaciones en el cuerpo. La mayora de la gente asocia el
Hacking con infringir la ley y asume que todo el que se
dedica a actividades de Hacking es un criminal. Es cierto
que hay gente ah fuera que utiliza tcnicas de Hacking para violar la ley, pero
el Hacking no se trata realmente de eso. De hecho, el Hacking est ms cerca de
seguir la ley que de romperla.
La esencia del Hacking est encontrando usos no previstos o ignorados por las leyes
y propiedades de una situacin dada y luego aplicndolas en formas nuevas e
inventivas para resolver un problema, sea lo que sea.
El problema matemtico siguiente ilustra la esencia del Hacking:
Usa cada uno de los nmeros 1, 3, 4, y 6 de una sola vez con cualquiera de las cuatro
operaciones matemticas bsicas (suma, resta, multiplicacin y divisin) para que de
un total de 24. Cada nmero debe ser usado una vez y slo una vez, y es posible

Traductor: Ivinson - @IvinsonCLS

HACKING: EL ARTE DE LA EXPLOTACIN 2NDA EDICIN Traducido por Ivinson 2012

definir el orden de las operaciones, por ejemplo, 3 * (4 + 6) + 1 = 31 es vlido, sin


embargo incorrecta, ya que no hace un total de 24.
Las reglas para este problema estn bien definidas y simples, pero la respuesta escapa
a muchos. Al igual que la solucin a este problema (que se muestra en la ltima
pgina de este libro), las soluciones hackeadas siguen las reglas del sistema, pero
utilizan los reglas de maneras contrarias a la intuicin. Esto pone al lmite a los
hackers, lo que les permite resolver problemas de maneras inimaginables para
aquellos confinados al pensamiento y metodologas convencionales.
Desde la infancia de los ordenadores, los hackers han estado resolviendo problemas
creativamente. A finales de 1950, al club de ferrocarriles modelo MIT se le dio una
donacin de piezas, en su mayora equipos telefnicos viejos. Los miembros del club
utilizaron este equipo para montar un sistema complejo que permita a mltiples
operadores controlar diferentes partes de la pista, marcando en las secciones
correspondientes. Ellos llamaron hacking a este nuevo e inventivo uso de equipo
telefnico, y mucha gente considera este grupo como los hackers originales. El grupo
pas a la programacin de tarjetas perforadas y cinta de teletipo para las primeras
computadoras como la IBM 704 y el TX-0. Mientras que otros se contentaron con
escribir programas que resolvan problemas, los primeros hackers estaban
obsesionados con los programas de escritura que resuelven problemas tambin. Un
nuevo programa que consegua el mismo resultado como uno ya existente pero que
utilizaba menos tarjetas perforadas se consideraba el mejor, incluso a pesar de que
hizo lo mismo. La diferencia clave es cmo el programa logr sus resultados elegancia.
Ser capaz de reducir el nmero de tarjetas perforadas necesarias para un programa
mostr una maestra artstica sobre el equipo. Una mesa bien diseada puede contener
un jarrn tan bien como una caja de leche puede, pero uno seguramente se ve mucho
mejor que el otro. Los primeros hackers demostraron que los problemas tcnicos
pueden tener soluciones artsticas, y as transformaron la programacin de una mera
tarea de ingeniera en una forma de arte.
Al igual que muchas otras formas de arte, el Hacking fue a menudo mal entendido.
Los pocos que lo lograron formaron una subcultura informal que se mantuvo
concentrada intensamente en el aprendizaje y el dominio de su arte. Ellos crean que
la informacin debera ser libre y cualquier cosa que se interpusiera en el camino de
la libertad debera ser evitada.
Tales obstculos incluyen las figuras de autoridad, la burocracia de clases de la
universidad, y la discriminacin. En un mar de estudiantes impulsados a graduarse,

Traductor: Ivinson - @IvinsonCLS

HACKING: EL ARTE DE LA EXPLOTACIN 2NDA EDICIN Traducido por Ivinson 2012

este grupo no oficial de hackers desafiaron las metas convencionales y buscaron el


conocimiento mismo. Este deseo de aprender continuamente y explorar trascendi
hasta los lmites convencionales elaborados por la discriminacin, evidentes en la
aceptacin de Peter Deutsch, 12, del club de ferrocarriles modelo MIT al demostrar
su conocimiento de la TX-0 y su deseo de aprender. La edad, raza, sexo, apariencia,
grados acadmicos, y la situacin social no eran criterios principales para juzgar el
valor de otra persona, no por un deseo de la igualdad, sino por el deseo de promover
el arte emergente del Hacking.
Los hackers originales encontraron el esplendor y la elegancia en la forma ciencias
convencionales y secas de las matemticas y la electrnica. Vieron la programacin
como una forma de la expresin artstica y la computadora como un instrumento de
ese arte. Su deseo para diseccionar y entender que no pretenda desmitificar los
esfuerzos artsticos, sino que era simplemente una forma de lograr un mayor aprecio
de ellos. Estos valores hacia del conocimiento con el tiempo se llamaran la tica del
hacker: la apreciacin de la lgica como una forma de arte y la promocin de la libre
circulacin de la informacin, superacin de los lmites convencionales y las
restricciones para el simple objetivo de una mejor comprensin del mundo. Esta no es
una nueva tendencia cultural, los pitagricos de la Grecia antigua tuvieron una tica
similar y subcultura, a pesar de no poseer computadoras. Ellos vieron la belleza de las
matemticas y descubri muchos conceptos bsicos de geometra. Esa sed de
conocimiento y sus subproductos beneficiosos continuaran a travs de la historia,
desde los pitagricos a Ada Lovelace a Alan Turing para los hackers del club de
ferrocarriles modelo MIT.
Hackers modernos como Richard Stallman y Steve Wozniak han continuado el
legado de Hacking, trayndonos los sistemas operativos modernos, lenguajes de
programacin, ordenadores personales, y muchas otras tecnologas que utilizamos
cada da.
Cmo se puede distinguir entre los buenos hackers que nos traen las maravillas del
progreso tecnolgico y los hackers malignos que roban nuestros nmeros de tarjeta
de crdito? El trmino cracker fue acuado para distinguir los hackers malignos de
los buenos. Los periodistas dijeron que crackers se suponen que son los malos,
mientras que los hackers eran los buenos. Los hackers se mantuvieron fieles a la tica
del hacker, mientras que los crackers estaban slo interesado en romper la ley y hacer
dinero rpido. Los crackers se consideran mucho menos talentosos que los hackers de
lite, ya que simplemente hicieron uso de herramientas y scripts de Hacking escritos
sin entender cmo funcionaban. Cracker estaba destinado a ser la etiqueta para quien
hiciera cosas sin escrpulos con un ordenador pirateando software, destruyendo

Traductor: Ivinson - @IvinsonCLS

HACKING: EL ARTE DE LA EXPLOTACIN 2NDA EDICIN Traducido por Ivinson 2012

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

Traductor: Ivinson - @IvinsonCLS

HACKING: EL ARTE DE LA EXPLOTACIN 2NDA EDICIN Traducido por Ivinson 2012

se utiliza como un control de consumo de la industria. Quines son los hackers


informticos y que son los crackers ahora? Cuando las leyes parecen interferir con la
libertad de expresin, los chicos buenos que dicen lo que sienten de repente se
vuelven malos? Creo que el espritu del hacker trasciende las leyes gubernamentales,
en lugar de ser definido por ellos.
Las ciencias de la fsica nuclear y la bioqumica se pueden utilizar para matar, sin
embargo, tambin nos proveen con el avance cientfico significativo y la medicina
moderna. No hay nada bueno o malo sobre el conocimiento mismo; la moralidad
reside en la aplicacin de los conocimientos. Incluso si quisiramos, no podramos
suprimir el conocimiento de cmo convertir la materia en energa o detener el
progreso tecnolgico continuo de la sociedad. De la misma manera, el espritu hacker
no puede ser detenido, ni puede ser clasificado fcilmente o disecado.
Los hackers siempre estarn empujando los lmites del comportamiento aceptable y el
conocimiento, nos obliga a explorar ms y ms.
Parte de este camino se traduce en una beneficiosa co-evolucin de seguridad a travs
de la competencia entre los hackers atacantes y defensores. As como la gacela rpida
se adapt a ser perseguida por el leopardo, y el leopardo se volvi an ms rpido
por perseguir a la gacela, la competencia entre los hackers proporciona a los usuarios
una mejor y ms fuerte seguridad, as como tcnicas de ataque ms complejas y
sofisticadas. La introduccin y el avance de los sistemas de deteccin de intrusos
(IDS) es un buen ejemplo de este proceso co-evolutivo. Los hackers defensores crean
IDS para aadirlos a su arsenal, mientras que los hackers atacantes desarrollan
tcnicas de evasin de IDS, que finalmente tuvo una compensacin en productos IDS
ms grandes y mejores.
El resultado neto de esta interaccin es positivo, ya que produce personas ms
inteligentes, mejora la seguridad, el software es ms estable, tcnicas inventivas de
resolucin de problemas, e incluso una nueva economa.
La intencin de este libro es ensearte sobre el verdadero espritu del Hacking.
Veremos tcnicas de hackers diversos, desde el pasado hasta el presente,
diseccionando para aprender cmo y por qu funcionan. Se incluye con este libro un
LiveCD booteable que contiene todo el cdigo fuente utilizado en este documento,
as como un entorno Linux preconfigurado. La exploracin y la innovacin son
fundamentales para el arte del Hacking, por lo que este CD te permitir seguir
adelante y experimentar por tu cuenta. El nico requisito es un procesador x86, que
es utilizado por todas las mquinas de Microsoft Windows y los nuevos ordenadores

Traductor: Ivinson - @IvinsonCLS

HACKING: EL ARTE DE LA EXPLOTACIN 2NDA EDICIN Traducido por Ivinson 2012

Macintosh, simplemente inserta el CD y reinicia. Este entorno Linux suplente no


molesta a tu sistema operativo existente, por lo que cuando hayas terminado,
simplemente reinicia de nuevo y extrae el CD.
De esta manera, ganars una comprensin prctica y apreciacin del Hacking que
pueden inspirarte a mejorar las tcnicas existentes o incluso de inventar otras nuevos.
Esperamos que este libro estimule la naturaleza hacker curiosa en ti y te pida que
contribuyas al arte del Hacking, de alguna manera, sin importar de qu lado de la
valla elijas estar.

Traductor: Ivinson - @IvinsonCLS

HACKING: EL ARTE DE LA EXPLOTACIN 2NDA EDICIN Traducido por Ivinson 2012

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,

Traductor: Ivinson - @IvinsonCLS

HACKING: EL ARTE DE LA EXPLOTACIN 2NDA EDICIN Traducido por Ivinson 2012

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.

Traductor: Ivinson - @IvinsonCLS

HACKING: EL ARTE DE LA EXPLOTACIN 2NDA EDICIN Traducido por Ivinson 2012

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.

Traductor: Ivinson - @IvinsonCLS

HACKING: EL ARTE DE LA EXPLOTACIN 2NDA EDICIN Traducido por Ivinson 2012

Cualquier programa escrito utilizando el lenguaje ensamblador para la arquitectura de


un procesador no funcionar en otra arquitectura de procesador. Si un programa est
escrito en lenguaje ensamblador x86, debe ser reescrito para ejecutarse en la
arquitectura Sparc. Adems, con el fin de escribir un programa eficaz en lenguaje
ensamblador, todava tienes que saber muchos detalles de bajo nivel de la
arquitectura del procesador para el que ests escribiendo.
Estos problemas pueden ser mitigados por otra forma de traductor llamado
compilador. Un compilador convierte un lenguaje de alto nivel a lenguaje de
mquina.
Los lenguajes de alto nivel son mucho ms intuitivos que el lenguaje ensamblador y
se puede convertir en muchos tipos de lenguaje de mquina diferentes para
arquitecturas de procesador. Esto significa que si un programa est escrito en un
lenguaje de alto nivel, el programa slo es necesario que se escriba una vez, el mismo
trozo de cdigo del programa puede ser compilado en lenguaje de mquina para
diferentes arquitecturas especficas. C, C++ y Fortran son ejemplos de lenguajes de
alto nivel.
Un programa escrito en un lenguaje de alto nivel es parecido al ingls y mucho ms
fcil de leer que el lenguaje ensamblador o lenguaje de mquina, pero an debes
seguir reglas muy estrictas acerca de cmo las instrucciones estn redactadas, o el
compilador no ser capaz de entenderlo.

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.

Traductor: Ivinson - @IvinsonCLS

HACKING: EL ARTE DE LA EXPLOTACIN 2NDA EDICIN Traducido por Ivinson 2012

0x230 Estructuras de Control


Sin estructuras de control, un programa no sera ms que una serie de instrucciones
ejecutadas en orden secuencial. Esto est bien para programas muy simples, pero la
mayora de los programas, como el ejemplo de direcciones de manejo, no son tan
simples. Las direcciones de manejo incluan afirmaciones como: Contine por la
calle principal hasta que vea una iglesia a la derecha y si la calle est bloqueada
a causa de la construccin Estos enunciados son conocidos como estructuras de
control, y cambian el flujo del programa de ejecucin de una orden secuencial simple
de un flujo ms complejo y ms til.
0x231 If-Then-Else
En el caso de nuestras indicaciones para viajar, la Calle Principal puede estar en
construccin.
Si es cierto, un conjunto especial de instrucciones debe abordar esta situacin. De lo
contrario, el conjunto original de instrucciones deben ser seguidas. Estos tipos de
casos especiales pueden ser contabilizados en un programa con una de las estructuras
de control ms naturales: la estructura if-then-else. En general, se ve algo como esto:
------------------------------------------------------------------------------------------------------If (condicin) then //If significa Si y Then entonces.
{
Conjunto de instrucciones que se ejecutarn si la condicin se cumple;
}
Else
{
Conjunto de instrucciones que se ejecutarn si la condicin no se cumple;
}
------------------------------------------------------------------------------------------------------Para este libro, se utilizar un pseudo-cdigo tipo lenguaje C, por lo que cada
instruccin terminar con un punto y coma, y los conjuntos de instrucciones se
agruparn con llaves y sangra.

Traductor: Ivinson - @IvinsonCLS

HACKING: EL ARTE DE LA EXPLOTACIN 2NDA EDICIN Traducido por Ivinson 2012

La estructura de pseudo-cdigo if-then-else de acuerdo a las indicaciones


precedentes, podra ser algo como esto:
------------------------------------------------------------------------------------------------------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;
}
------------------------------------------------------------------------------------------------------Cada instruccin est en su propia lnea, y los diversos conjuntos de instrucciones
condicionales se agrupan entre llaves y sangra para facilitar la lectura.
En C y muchos otros lenguajes de programacin, la palabra clave entonces est
implcita y por lo tanto queda fuera, por lo que tambin se ha omitido en el pseudocdigo precedente.
Por supuesto, otros lenguajes requieren la palabra clave then en su sintaxis - BASIC,
Fortran, e incluso Pascal, por ejemplo. Estos tipos de diferencias sintcticas de los
lenguajes de programacin son slo superficiales, la estructura subyacente sigue
siendo la misma. Una vez que un programador entiende los conceptos que estos
lenguajes estn tratando de transmitir, el aprendizaje de las diferentes variaciones
sintcticas es bastante trivial. Puesto que se utilizar C en las secciones posteriores, el
pseudo-cdigo utilizado en este libro sigue una sintaxis similar a C, pero recuerda
que el pseudo-cdigo puede tomar muchas formas.
Otra regla comn de sintaxis similar a C es cuando un conjunto de instrucciones
delimitadas por llaves consiste en una sola instruccin, las llaves son opcionales. En
aras de la legibilidad, es una buena idea ponerle sangra a estas instrucciones, pero no
es sintcticamente necesario.

Traductor: Ivinson - @IvinsonCLS

HACKING: EL ARTE DE LA EXPLOTACIN 2NDA EDICIN Traducido por Ivinson 2012

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).

Traductor: Ivinson - @IvinsonCLS

HACKING: EL ARTE DE LA EXPLOTACIN 2NDA EDICIN Traducido por Ivinson 2012

0x232 Bucles While/Until


Otro concepto de programacin elemental es la estructura de control de
tiempo, que es un tipo de bucle. Un programador a menudo tendr que
ejecutar un conjunto de instrucciones ms de una vez. Un programa puede
realizar esta tarea a travs de un bucle, pero se requiere un conjunto de
condiciones que le indique cundo debe dejar de bucle, para que no contine
hasta el infinito. Un bucle while dice que se ejecute el siguiente conjunto de
instrucciones en un bucle mientras una condicin es verdadera. Un programa
sencillo para un ratn hambriento podra ser algo como esto:
------------------------------------------------------------------------------------------------------While (tengas hambre) //While significa Mientras.
{
Encuentra algo de comida;
Cmete la comida;
}
------------------------------------------------------------------------------------------------------El conjunto de las dos instrucciones siguientes a la sentencia while se
repetir mientras el ratn se queda con hambre. La cantidad de comida que
el ratn encuentra cada vez puede ir desde una pequea miga de pan hasta
todo el pan. Del mismo modo, el nmero de veces que el conjunto de
instrucciones de la sentencia while se ejecute cambia en funcin de la
cantidad de alimentos que el ratn encuentra.
Otra variacin sobre el bucle while es un bucle Until o hasta que, una
sintaxis que est disponible en el lenguaje de programacin Perl (C no utiliza
esta sintaxis). Un bucle Until no es ms que un bucle While con la sentencia
condicional invertida. El programa del mismo ratn utilizando un bucle Until
sera:
------------------------------------------------------------------------------------------------------Until (No tengas hambre) //Until significa Hasta que.
{
Encuentra algo de comida;
Cmete la comida;
}
-------------------------------------------------------------------------------------------------------

Traductor: Ivinson - @IvinsonCLS

HACKING: EL ARTE DE LA EXPLOTACIN 2NDA EDICIN Traducido por Ivinson 2012

Lgicamente, cualquier sentencia tipo Until se puede convertir en un bucle


while. Las direcciones de manejo anteriores tenan la declaracin Contine
en la calle principal hasta que vea una iglesia a su derecha. Esto puede ser
fcilmente cambiado por un bucle While estndar simplemente invirtiendo la
condicin.
------------------------------------------------------------------------------------------------------While (No haya una iglesia a la derecha)
Conduce por la calle principal;
------------------------------------------------------------------------------------------------------0x233 Bucles For
Otra estructura de control de bucle es el bucle For. Este se utiliza
generalmente cuando un programador desea repetir o iterar para un cierto
nmero de veces. La direccin de manejo Siga derecho 5 millas por
Destination Road se puede convertir en un bucle parecido a esto:
------------------------------------------------------------------------------------------------------For (5 iteraciones)
Siga derecho 1 milla;
------------------------------------------------------------------------------------------------------En realidad, un bucle For es un bucle While con un contador. La misma
afirmacin puede ser escrita as:
------------------------------------------------------------------------------------------------------Pon el contador a 0;
While (el contador sea menor que 5)
{
Sigue derecho 1 milla;
Aade 1 al contador;
}
-------------------------------------------------------------------------------------------------------

Traductor: Ivinson - @IvinsonCLS

HACKING: EL ARTE DE LA EXPLOTACIN 2NDA EDICIN Traducido por Ivinson 2012

La sintaxis de pseudo-cdigo similar a C de un bucle For hace esto an ms


evidente:
------------------------------------------------------------------------------------------------------For (i=0; i<5; i++)
Sigue derecho 1 milla;
------------------------------------------------------------------------------------------------------En este caso, el contador es llamado i, y la declaracin se dividi en tres
secciones, separadas por punto y coma. La primera seccin declara el
contador y la establece en su valor inicial, en este caso 0. La segunda
seccin es como una declaracin mientras se utiliza el contador: Mientras
que el contador cumpla con esta condicin, sigue iterando o repitiendo. La
tercera y ltima seccin describe las medidas que se deben tomar en el
contador durante cada iteracin. En este caso, i++ es una forma corta de
decir: Aade 1 al contador llamado i.
Con todas las estructuras de control, las direcciones de manejo de la pgina
23 se pueden convertir en pseudo-cdigo similar a C algo como lo siguiente:
------------------------------------------------------------------------------------------------------Comienza yendo hacia el este en la calle principal;
While (no haya una iglesia a la derecha)
Conduce por la calle principal;
If (la calle est bloqueada)
{
Gira a la derecha en la calle 15;
Gira a la izquierda en Pine Street;
Gira a la derecha en la calle 16;
}
Else
Gira a la derecha en la calle 16;
Gira a la izquierda en Destination Road;
For (i=0; i<5; i++)
Sigue derecho 1 milla;
Para en Destination Road 743;
-------------------------------------------------------------------------------------------------------

Traductor: Ivinson - @IvinsonCLS

HACKING: EL ARTE DE LA EXPLOTACIN 2NDA EDICIN Traducido por Ivinson 2012

0x240 Ms conceptos fundamentales de programacin


En las secciones siguientes, sern introducidos los conceptos de
programacin ms universales. Estos conceptos se utilizan en muchos
lenguajes de programacin, con unas pocas diferencias sintcticas. Al
introducir estos conceptos, los integrar en los ejemplos de pseudo-cdigo
utilizando sintaxis como C. Al final, el pseudo-cdigo debe ser muy similar al
cdigo C.
0x241 Variables
El contador utilizado en el bucle For es realmente un tipo de variable. Una
variable slo puede ser pensada como un objeto que contiene los datos que
se pueden cambiar, de ah el nombre. Tambin hay variables que no
cambian, que son acertadamente 12 0x200 denominadas constantes.
Volviendo al ejemplo de manejo, la velocidad del carro sera una variable,
mientras que el color sera una constante. En pseudocdigo, las variables
son simples conceptos abstractos, pero en C (y en muchos otros lenguajes),
las variables deben ser declaradas y se declara el tipo antes de que puedan
ser utilizadas. Esto es porque un programa en C eventualmente se compilar
en un programa ejecutable. Al igual que una receta de cocina que enumera
todos los ingredientes necesarios antes de dar las instrucciones, las
declaraciones de variables te permiten hacer los preparativos antes de entrar
en la carne del programa. En ltima instancia, todas las variables se
almacenan en memoria en algn lugar, y sus declaraciones permiten que el
compilador organice esta memoria de manera ms eficiente. Al final, sin
embargo, a pesar de todas las declaraciones de tipos de variables, todo es
solo memoria.
En C, a cada variable se da un tipo que describe la informacin destinada a
ser almacenada en esa variable. Algunos de los tipos ms comunes son int
(valores enteros), float (valores decimales de coma flotante) y char (valores
de caracteres simples). Las variables se declaran simplemente usando estas
palabras claves antes de enumerar las variables, como se puede ver a
continuacin.
------------------------------------------------------------------------------------------------------int a, b;
float k;
char z;
-------------------------------------------------------------------------------------------------------

Traductor: Ivinson - @IvinsonCLS

HACKING: EL ARTE DE LA EXPLOTACIN 2NDA EDICIN Traducido por Ivinson 2012

La variables a y b se definen ahora como enteros, k puede aceptar valores


de punto flotante (por ejemplo: 3,14), y z se espera que mantenga un valor
de carcter, como A o w. A las variables se le pueden asignar valores que
hayan sido declarados o en cualquier momento despus, utilizando el
operador =.
------------------------------------------------------------------------------------------------------int a = 13, b;
float k;
char z = 'A';
k = 3.14;
z = 'w';
b = a + 5;
------------------------------------------------------------------------------------------------------Despus de que las siguientes instrucciones se ejecutan, la variable a vale
13, k contendr el nmero 3,14, z contendr el carcter w, y b contendr el
valor 18, puesto que 13 ms 5 es igual a 18. Las variables son simplemente
una manera de recordar los valores, sin embargo, con C, primero debes
declarar cada tipo de variable.
0x242 Operadores Aritmticos
La declaracin b = a + 7 es un ejemplo de un operador aritmtico muy
simple.
En C, los siguientes smbolos son utilizados en operaciones de clculo
diferentes.
Las primeras cuatro operaciones deberan parecerte familiares. Reduccin
de mdulo puede parecer un concepto nuevo, pero en realidad es
simplemente tomar el resto despus de la divisin.
Si a es 13, entonces 13 dividido por 5 es igual a 2, con un resto de 3, lo que
significa que a % 5 = 3. Tambin, puesto que las variables a y b son nmeros
enteros, la instruccin b = a / 5 resultar en el valor de 2 almacenado en b,
ya que es la parte entera de la misma. Las variables de punto flotante deben
ser utilizadas para retener la respuesta ms correcta de 2,6.

Traductor: Ivinson - @IvinsonCLS

HACKING: EL ARTE DE LA EXPLOTACIN 2NDA EDICIN Traducido por Ivinson 2012

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.

Estas expresiones abreviadas se pueden combinar con otras operaciones


aritmticas para producir expresiones ms complejas. Aqu es donde la
diferencia entre i++ y ++i se hace evidente. La primera expresin significa
Incrementar el valor de i a 1 despus de evaluar la operacin aritmtica,
mientras que la segunda expresin significa incrementar el valor de i a 1
antes de evaluar la operacin aritmtica. El siguiente ejemplo ayudar a
aclarar.
------------------------------------------------------------------------------------------------------int a, b;
a = 5;
b = a++ * 6;
-------------------------------------------------------------------------------------------------------

Traductor: Ivinson - @IvinsonCLS

HACKING: EL ARTE DE LA EXPLOTACIN 2NDA EDICIN Traducido por Ivinson 2012

Al final de este conjunto de instrucciones, b valdr 30 y tambin 6, ya que la


abreviatura de b = a++ * 6; es equivalente a las siguientes afirmaciones:
------------------------------------------------------------------------------------------------------b = a * 6;
a = a + 1;
------------------------------------------------------------------------------------------------------Sin embargo, si la instruccin b = ++a * 6; se utiliza, el orden de la suma de a
cambia, dando como resultado las instrucciones equivalentes siguientes:
------------------------------------------------------------------------------------------------------a = a + 1;
b = a * 6;
------------------------------------------------------------------------------------------------------Ya que el orden se ha modificado, en este caso b contendr 36, y a todava
contendr 6.
Muy a menudo en los programas, las variables deben ser modificadas en su
lugar. Por ejemplo, puede que tengas que agregar un valor arbitrario como
12 a una variable, y almacenar el resultado de nueva en esa variable (por
ejemplo, i = i + 12). Esto ocurre con bastante frecuencia y tambin existe
abreviatura para ello.

Expresin completa Abrev. Explicacin


i = i + 12
i = i - 12
i = i * 12
i = i / 12

i+=12
i-=12
i*=12
i/=12

Aade un valor a la variable.


Resta un valor a la variable.
Multiplica un valor por la variable.
Divide un valor de la variable.

Traductor: Ivinson - @IvinsonCLS

HACKING: EL ARTE DE LA EXPLOTACIN 2NDA EDICIN Traducido por Ivinson 2012

0x243 Operadores de Comparacin


Las variables se utilizan con frecuencia en las sentencias condicionales de
las estructuras de control previamente explicadas. Estas declaraciones
condicionales se basan en algn tipo de comparacin. En C, los operadores
de comparacin utilizar una sintaxis abreviada que es bastante comn en
muchos lenguajes de programacin.

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)

La mayora de estos operadores no necesitan explicacin, sin embargo,


observa que la forma abreviada de igual a usa doble signo de igual (==).
Esta distincin es importante, ya que el doble signo de igual se utiliza para
probar la equivalencia, mientras que el signo igual se utiliza para asignar un
valor a una variable. La sentencia a = 7 significa pon el valor 7 en la
variable a, mientras que a == 7 significa chequea si la variable a es igual a
7. (Algunos lenguajes de programacin como Pascal realmente usan: = para
la asignacin de variables para eliminar la confusin visual.) Tambin,
observa que un signo de exclamacin significa generalmente no. Este
smbolo puede ser utilizado por s mismo para invertir cualquier expresin.
------------------------------------------------------------------------------------------------------!(a < b) es equivalente a (a >= b)
-------------------------------------------------------------------------------------------------------

Traductor: Ivinson - @IvinsonCLS

HACKING: EL ARTE DE LA EXPLOTACIN 2NDA EDICIN Traducido por Ivinson 2012

Los operadores de comparacin tambin se pueden unir utilizando la


abreviatura de OR y AND.

Lgico

OR
AND

Smbolo

||
&&

Ejemplo

((a < b) ||
(a < c))
((a < b) && ! (a < c))

La declaracin de ejemplo consta de las dos condiciones ms pequeas


unidas con OR lgico que sern verdaderas si a es menor que b, o si a es
menor que c. De manera similar, la sentencia del ejemplo consta de dos
comparaciones ms pequeas unidas con AND lgico que sern verdaderas
si a es menor que b y si a no es que c. Estas declaraciones deben ser
agrupadas con parntesis y pueden contener muchas variaciones diferentes.
Muchas cosas pueden resumirse en las variables, operadores de
comparacin y estructuras de control. Volviendo al ejemplo del ratn en
busca de alimento, el hambre se puede traducir en una variable Boolean, o
sea true o false (verdadero o falso). Naturalmente, 1 significa verdadero y 0
significa falso.
------------------------------------------------------------------------------------------------------While (Hambriento == 1)
{
Busca comida;
Cmete la comida;
}
------------------------------------------------------------------------------------------------------Aqu hay otra abreviatura utilizada por los programadores y hackers a
menudo. C no tiene realmente ningn operador boolean, por lo que cualquier
valor distinto de cero es considerado verdadero, y una declaracin se
considera falsa si contiene 0. De hecho, los operadores de comparacin en
realidad retornan un 1 si la comparacin es verdadera y 0 si es falsa. Para
comparar si la variable Hambriento es igual a 1 retorna 1 si tiene Hambriento
es igual a 1 y 0 si tiene Hambriento es igual a 0. Dado que el programa slo

Traductor: Ivinson - @IvinsonCLS

HACKING: EL ARTE DE LA EXPLOTACIN 2NDA EDICIN Traducido por Ivinson 2012

utiliza estos dos casos, el operador de comparacin se puede quitar por


completo.
------------------------------------------------------------------------------------------------------While (Hambriento)
{
Busca comida;
Cmete la comida;
}
------------------------------------------------------------------------------------------------------Un programa de ratn ms inteligente con ms entradas muestra cmo los
operadores de comparacin se pueden combinar con variables.
------------------------------------------------------------------------------------------------------While ((Hambriento) && (gato_presente!))
{
Busca comida;
If (! (La_comida_est_en_la_trampa))
Cmete la comida;
}
------------------------------------------------------------------------------------------------------Este ejemplo asume que hay tambin variables que describen la presencia
de un gato y la ubicacin de la comida, con 1 para verdadero y 0 para falso.
Slo recuerda que cualquier valor distinto a cero se considerar verdadero, y
0 se considerar falso.
0x244 Funciones
A veces habr un conjunto de instrucciones que el programador sabe que va
a necesitar varias veces. Estas instrucciones se pueden agrupar en un
subprograma ms pequeo llamado funcin. En otros lenguajes, las
funciones que se conocen como subrutinas o procedimientos. Por ejemplo, la
accin de cruzar un carro en realidad se compone de muchas instrucciones
pequeas: Enciende el intermitente correspondiente, reduce la velocidad,
verifica el trfico, gira el volante en la direccin adecuada, y as
sucesivamente. Las direcciones de manejo desde el principio de este

Traductor: Ivinson - @IvinsonCLS

HACKING: EL ARTE DE LA EXPLOTACIN 2NDA EDICIN Traducido por Ivinson 2012

captulo requieren pocos giros, sin embargo, listando cada instruccin


pequea por cada vuelta sera tedioso (y menos legible). Puedes pasar
variables como argumentos a una funcin con el fin de modificar la forma en
que la funcin opera. En este caso, a la funcin se le pasa la direccin del
giro.
------------------------------------------------------------------------------------------------------Funtion Cruzar (variable_de_direccion)
{
Activar el intermitente de la variable_de_direccion;
Disminuye la velocidad;
Comprueba si vienen carros;
while (vienen carros)
{
Detente;
Ten cuidado con el trfico en direccin contraria;
}
Gira el volante hacia la variable_de_direccion;
While (El giro no est completo)
{
if (velocidad <5 mph)
Acelera;
}
Gira el volante a la posicin original;
Apaga la luz intermitente de la variable_de_direccion;
}
------------------------------------------------------------------------------------------------------Esta funcin describe todas las instrucciones necesarias para cruzar.
Cuando un programa que sabe acerca de esta funcin tiene que cruzar, slo
puede llamar a esta funcin. Cuando la funcin es llamada, las instrucciones
que se encuentran dentro de ella se ejecutan con los argumentos que se le
pasan; despus, la ejecucin vuelve a donde estaba en el programa,
despus de la llamada a la funcin. Izquierda o derecha se pueden pasar en
esta funcin, que hace que la funcin cruce en esa direccin.
De forma predeterminada en C, las funciones pueden retornar un valor al
llamador. Para quienes estn familiarizados con funciones en matemticas,
esto tiene mucho sentido. Imagina una funcin que calcula el factor de un
nmero - naturalmente, retorna el resultado.

Traductor: Ivinson - @IvinsonCLS

HACKING: EL ARTE DE LA EXPLOTACIN 2NDA EDICIN Traducido por Ivinson 2012

En C, las funciones no estn marcadas con una de palabra clave "function",


sino que son declaradas por el tipo de datos de la variable que estn
retornando.
Este formato es muy similar a la declaracin de variables. Si una funcin
debe retornar un entero (tal vez una funcin que calcule el factor de algn
nmero x), la funcin podra tener este aspecto:
------------------------------------------------------------------------------------------------------int factor(int x)
{
int i;
for (i=1; i<x; i++)
x *= i;
return x;
}
------------------------------------------------------------------------------------------------------Esta funcin se declara como un entero porque multiplica cada valor de 1 a x
y retorna el resultado, que es un nmero entero. La instruccin de retorno en
el extremo de la funcin pasa de nuevo el contenido de la variable x y
termina la funcin. Esta funcin factor puede ser utilizada como una variable
entera en la parte principal de cualquier programa que lo reconozca.
------------------------------------------------------------------------------------------------------int a=5, b;
b = factor(a);
------------------------------------------------------------------------------------------------------Al final de este programa corto, la variable b contendr 120, ya que la funcin
factor se llama con el argumento de 5 y devolver 120.
Tambin en C, el compilador debe "saber" acerca de las funciones antes de
poder utilizarlas. Esto se puede hacer simplemente escribiendo la funcin
entera antes de usarla ms tarde en el programa o mediante el uso de
prototipos de funcin. Un prototipo de funcin es simplemente una manera
de decirle al compilador que espere una funcin con este nombre, este tipo
de datos de retorno, y estos tipos de datos como argumentos funcionales. La
funcin real puede estar situada cerca del final del programa, pero puede ser

Traductor: Ivinson - @IvinsonCLS

HACKING: EL ARTE DE LA EXPLOTACIN 2NDA EDICIN Traducido por Ivinson 2012

utilizada en cualquier otro lugar, ya que el compilador ya sabe. Un ejemplo


de un prototipo de funcin para la funcin factor() sera algo como esto:
------------------------------------------------------------------------------------------------------int factor(int);
------------------------------------------------------------------------------------------------------Por lo general, los prototipos de funcin se encuentran cerca del comienzo
de un programa. No hay necesidad de definir realmente los nombres de
variables en el prototipo, ya que esto se hace en la propia funcin. Lo nico
que el compilador le importa es el nombre de la funcin, los tipos de datos de
retorno y los tipos de datos de sus argumentos funcionales.
Si una funcin no tiene ningn valor a retornar, debe ser declarada como
Void (vaco), como es el caso de la funcin Cruzar() que utilizamos como un
ejemplo anterior. Sin embargo, funcin Cruzar() todava no capta toda la
funcionalidad que nuestras direcciones de manejo necesitan. Cada giro en
las direcciones tiene una direccin y un nombre de calle. Esto significa que
una funcin de giro debe tener dos variables: la direccin del giro y de la
calle a girar. Esto complica la funcin de giro, ya que la calle apropiada debe
estar situada antes de que el cambio se pueda hacer. Una de las funciones
de giro ms completa utilizando la sintaxis correcta similar a C se enumera a
continuacin en pseudo-cdigo.
------------------------------------------------------------------------------------------------------Void Cruzar (variable_de_direccion, nombre_de_la_calle)
{
Busca un aviso en la calle;
nombre_de_interseccion_actual = leer aviso en la calle;
while (nombre_de_interseccion_actual != nombre_de_la_calle )
{
Busca otro aviso en la calle;
nombre_de_interseccion_actual = leer aviso en la calle;
}
Activa el intermitente de variable_de_direccion;
Disminuye la velocidad;
Compruebe si vienen carros;

Traductor: Ivinson - @IvinsonCLS

HACKING: EL ARTE DE LA EXPLOTACIN 2NDA EDICIN Traducido por Ivinson 2012

while (hay trfico de frente)


{
Detente;
Ten cuidado con el trfico en direccin contraria;
}
Gira el volante hacia la variable_de_direccion;
While (el giro no est completo)
{
if (velocidad <5 mph)
Acelera;
}
Gira el volante a la posicin original;
Apaga la luz intermitente de la variable_de_direccion;
}
------------------------------------------------------------------------------------------------------Esta funcin incluye una seccin que busca la interseccin correcta
buscando seales en la calle, leyendo el nombre de cada aviso y
almacenando
ese
nombre
en
una
variable
llamada
nombre_de_interseccion_actual. Seguir buscando y leyendo los avisos
hasta encontrar la calle de destino, en ese momento, las instrucciones de
giro restantes sern ejecutadas. Las instrucciones de conduccin en pseudocdigo pueden ahora ser cambiadas para usar esta funcin de giro.
------------------------------------------------------------------------------------------------------Comienza yendo hacia el este en la calle principal;
While (no haya una iglesia a la derecha)
Conduce por la calle principal;
If (la calle est bloqueada)
{
Cruzar(Derecha, Calle 15);
Cruzar (Izquierda, Pine Street);
Cruzar (Derecha, Calle 16);
}

Traductor: Ivinson - @IvinsonCLS

HACKING: EL ARTE DE LA EXPLOTACIN 2NDA EDICIN Traducido por Ivinson 2012

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.

Traductor: Ivinson - @IvinsonCLS

Вам также может понравиться