Primera parte - la fuerza bruta
Etapa preparatoria - nuestro
primer intento donde tratamos de atacar a fuerza bruta un escenario.
NV hacking: Este es un tema muy interesante y amplio, sobretodo
por esos rompecabezas que a veces hacen trabajar mucho a nuestro cerebro :)
Trataré de mostrarte las bases de la Ingeniería Inversa y el hacking en general en este capítulo.
El intérprete de script de prueba está aquí.
Descárgalo ahora pero trata de no mirar el código fuente todavía :)
Lo que necesitamos
ahora es un editor hexadecimal. Si no tienes ninguno te sugiero el 010 editor (la versión trial
vale por ahora) - hace tiempo usaba WinHex pero es pésimo cuando trabaja en la
configuración japonesa - casi se hacía inservible. Probé esta herramienta y
resultó ser bastante buena.
Así que, comencemos.
¿Ves runme.dat en el
directorio de Scenario Runner? Eso es un "escenario"
que funciona. Abre el EXE. El escenario es simple, así como el propio
intérprete - genera una cadena, después te hace una pregunta y dependiendo de
tu respuesta volverá a hacer la misma pregunta o emitirá un mensaje y saldrá.
Tu trabajo consiste en cambiar las cadenas que muestra - eso
es lo que hacemos cuando tenemos que traducir un juego, por ejemplo.
Para comenzar
usaremos la fuerza bruta: Abre runme.dat
en un editor hexadecimal. Puedes ver claramente algunas cadenas como "Make me laugh!" y otras. ¿Qué tal si cambiamos una de ellas?
Edita la primera cadena
- Yo puse "Do not cry..."
- en este caso tenemos una "!" extra a la izquierda de la anterior
cadena - bórrala. El archivo tendrá 1 byte menos.
Cuando editas con un editor hexadecimal hay dos áreas donde
puedes hacerlo - a la izquierda debes introducir valores hexadecimales (0-9,
a-f) mientras que a la derecha puedes introducir letras y otros símbolos
normalmente. Dado que necesitamos introducir una cadena "humana" es
más conveniente que lo hagamos en el lado derecho.
De todos modos, puedes alternar entre los dos lados pulsando Tab.
También, fíjate en que hay dos maneras - sobrescribir e insertar. Puedes cambiar de uno a otro como sueles hacerlo en los
editores de texto normales - pulsando la tecla Insert.
Abre el exe. Oh oh, tenemos una excepción y también vemos que han
salido algunos "☺" - aunque es
importante ser positivo no es exactamente lo que esperábamos ver :)
Probablemente olvidamos
actualizar algo, por ejemplo, la longitud de una cadena. Naturalmente, la aplicación debe saber cuan
larga es la cadena. ¿Cómo podrá saberlo?
Recordemos algo sobre dos tipos
generales de cadenas - Estilo-C y estilo-Pascal. Como sabrás, el estilo-C no
tiene ningún campo de longitud, la longitud es determinada en tiempo de
ejecución mediante la búsqueda de un caracter con código #0: 32 33 34 00. El estilo-Pascal no utiliza caracteres nulos, más bien incluye la longitud de
la cadena antes de la cadena actual, lo que hace que la cadena sea procesada más rápido (a costa de
tener un campo de longitud adicional, pero es un coste muy bajo) :
03 00 32 33 34. Normalmente, este campo es de 2 (palabra) o de 4(doble palabra) bytes de longitud.
03 00 32 33 34. Normalmente, este campo es de 2 (palabra) o de 4(doble palabra) bytes de longitud.
Necesitamos mirar todo para encontrar dónde está el
problema. ¿Puedes hacerlo por ti mismo?
:)
----------------------------
Esto es lo que tenemos : 0E 00 44 6F 20 6E 6F 74 20 63 72 79 2E 2E 2E.
Esos bytes 0E
00 parecen ser la longitud de la cadena, ¿verdad? Tenemos que hacer
una rápida conversión para comprobar esta suposición: presiona F11 (Tools | Converter Base) e introduce 0E en el campo hex - es 14
en notación decimal. Normalmente, también puedes hacer esto mediante el
establecimiento de un puntero antes de 0E y mirándolo con el Inspector bajo Unsigned Short.
Si estás usando un editor
hexadecimal diferente u otra cosa que te impida usar una herramienta de
conversión de notación de escritorio, puedes usar una base de conversión online como esta en i-tools.org.
Una rápida introducción sobre cómo los
números se almacenan en la memoria y otros lugares.
Algo que me pareció confuso sobre ellos al principio es que están
almacenados en orden contrario, ejemplo, si tenemos un número de 2 bytes y es
255 aparecerá como FF 00 en la
representación de máquina, no como 00FF
como escribimos. De hecho, esto es llamado little-endian
u orden de bytes Intel y también hay un orden
de bytes big-endian, que se mostrará como nuestra notación normal, es
decir, como 00 FF.
De todos modos, el orden de bytes Intel es el más ampliamente
utilizado (un sitio que conozco que
usa big-endian
son las transmisiones de red de área).
Por cierto, antes de hacer nada
con tu proyecto asegúrate de respaldar los archivos originales por si acaso los estropeas demasiado - siempre es un buen hábito que
adquirir.
Actualiza la longitud y
ejecuta el script. ¡Wow, es genial, tenemos un script
funcional! ¡Hurra!
...Bueno,
no exactamente después de investigar un poco - el script funciona correctamente
cuando se escoge la segunda opción - si no es así, se crasheará. Dice que el
bytecode está corrupto...
Ahora te dejo que explores el
script con el editor hexadecimal por ti mismo para que intentes
encontrar donde está el problema. Cuando hayas usado todas tus deducciones,
pasa a la parte más fascinante - ¡la depuración o debugging! :D