[SOLUCIONADO] Ayuda con code para curso de seguridad y explotacion.

Iniciado por JNIOR, Febrero 01, 2015, 08:50:02 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Febrero 01, 2015, 08:50:02 PM Ultima modificación: Febrero 02, 2015, 10:10:44 AM por Expermicid
Buenasss que tal foro? espero haberlo posteado en el lugar correcto ya que en otro lado no encajaba si bien es de programacion, esta relacionado a explotar, pero ustedes ya sabran que hacer con el post. (disculpas).

Estoy haciendo un curssito presencial de seguridad y explotacion el codigo en si es basico y el fin es 'fixearlo' no tiene mucha funcionalidad el programa lo q hace es pedir una palabra y repetirla las veces que le pongamos "hola" "10", asi repetiria hola 10 veces. El reto por asi decirlo es fixear los argumentos porq si no le paso los q me pide tira un segmentation fault!! y ahi es donde un hacker tomaria ventaja.....

Me podrian ayudar???? este es el codigo!

Código: c
#include <stdio.h>
void funcRepetir(char *path) {
   printf("Uso: %s <Palabra> <Veces a imprimir\n", path);
}
int main(int argc, char *argv[]) {
   int x, contador;
   contador = atoi(argv[2]);
   printf("Imprimiendo %d veces\n", contador);
   for(x=0;x<contador;x++)
      printf("%d - %s\n", x, argv[1]);
}


Lo que me piden son dos 3 cosas, 1) es como fixearlo para que no pase?, 2) es saber cual es la direccion de memoria o del buffer "ARGVC []" donde estan los parametros que le paso antes del segmentation fault..3) el porque del segmfault 'tecnicamente explicado'

Creanme que repase etc pero ouffffff estoy mareado y me esta costando mucho.. mañana deberia estar resolviendolo =( MIL GRACIAS!!!

Bueno, algo desprolijo como lo posteastes... pero estoy de humor y creo que puedo ayudarte jej.
(No aclaraste de que manera reversearlo asi que lo hice desde mi gdb bajo linux).

En principio el codigo, recibe en main 2 argumentos. Un entero, y un 'vector de argumentos' argv.
En la linea donde declara "contador = atoi(argv[2]);"
Invoca a la funcion "Ascii to integer". (ATOI), y toma como argumento el segundo (2), para transformarlo en entero ya que cuando se declaro, se declaro como 'char'.

Osea que el programa se ejecutaria ./a.out <mensaje> <veces>.
Si se ejecuta haciendo esto: ./a.out x
Da Segmentation Fault.

La manera de fixearlo es poniendo un Condicional IF y una salida en la funcion funcRepetir.
Lo testie y queda 'corregido' y funcionando de la siguiente manera:

En la funcion funcRepetir, terminala con un exit(1); (y ademas inclui <stdlib.h).
Luego en el main, justo despues de declarar los enteros 'x' y 'contador';
Aplica un condicional if:

   if (argc < 3)
   funcRepetir(argv[0]);


(Si hay menos de 3 argumentos sale..) (el primer argumento siempre es el del programa path/a.out).

Resuelto esto, vamos con la segunda pregunta. Como te dije lo reversie con el gdb de linux, previamente lo recompile con gcc y el flag -g. Como muestra la imagen corri el debugger y le inyecte una cadena 'soyhax0r' ;D asi buscamos el segmentatio fault:



Vemos el sentido de la pila a la inversa, y ponemos un breakpoint justo antes de que haga el segmentation fault, en 'main'. Como la matriz 'argv[]' es un puntero en realidad.. Este apunta a la cadena de strings que son tomadas como argumentos.. lo confirmamos en esta imagen y listo.



- Para en el breakpoint que puse en main.
- Examino el valor antes del segmentation fault que arroja 'argv=0xbffff1b4'.
- Examino las 4 primeras direcciones que tiene almacenada la direccion de la matriz argv..
- Compruebo que son los argumentos enviados antes del segmentation fault, el path, el soyhax0r que inyecte, y el segmentation fault........ 0x00000000 <es una direccion out-of-band>. Es decir que se encuentra fuera de los limites de memoria, cuando un programa intenta acceder a esa direccion de memoria se cuelga y falla.

Espero te haya servido.
Saludos.
Security Researcher
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Nooooo chabon sos una bestia!!!! jajaja me costo seguirte en algunas cosas pero fixie el programa como me mdijiste y quedo diez puntos!!!!!! Muchisimas gracias loco, la proxima sere mas ordenadoooo!!

MIL GRACIAS nuevamente!

De nada che, me alegra que haya funcionado, era la idea.
Saludos.
Security Researcher
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

No puedo agradecerte en el foro no me sale la opcion alguien podria hacerlo por mi? como puedo hacerlo yo?????

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No puedo agradecerte en el foro no me sale la opcion alguien podria hacerlo por mi? como puedo hacerlo yo?????

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Necesias 10 mensajes mínimo, pero yo ya le dí +1 por el gran trabajo ^^

Doy como solucionado el tema, si algún día puedes Agradecerle, solo tienes que entrar aquí y darle +1

Un saludo.