invertida - pilas y colas en c++
Explorar desbordamiento de pila en C (3)
La pregunta es sobre desbordamientos de pila en C. Tengo una asignación que no puedo hacer por mi vida, he visto todo en el gdb y no puedo entenderlo.
La pregunta es la siguiente:
int i,n;
void confused()
{
printf("who called me");
exit(0);
}
void shell_call(char *c)
{
printf(" ***Now calling /"%s/" shell command *** /n",c);
system(c);
exit(0);
}
void victim_func()
{
int a[4];
printf("[8]:%x/n", &a[8]);
printf("Enter n: "); scanf("%d",&n);
printf("Enter %d HEX Values /n",n);
for(i=0;i<n;i++) scanf("%x",&a[i]);
printf("Done reading junk numbers/n");
}
int main()
{
printf("ls=736c --- ps = 7370 --- cal = 6c6163/n");
printf("location of confused %x /n", confused);
printf("location of shell_call %x /n", shell_call);
victim_func();
printf("Done, thank you/n");
}
Ok, así que logré obtener la primera pregunta correctamente, que es llamar arbitrariamente a una de las dos funciones no explícitamente llamadas en la ruta principal. Por cierto, esto tiene que hacerse mientras se ejecuta el programa sin modificaciones. Hice esto ejecutando el programa, configurando N
a 7
, lo que me lleva al puntero de victim_func
marco victim_func
, escribo a[7]
con la dirección de memoria confusa o shell_call
, y funciona. (Tengo una máquina de 64 bits, por eso tengo que ponerla en 7, ya que el puntero EBI tiene 2 pulgadas de ancho, en lugar de 1)
Mi pregunta es la siguiente, ¿cómo podría controlar qué argumento pasa a la función shell_code
? es decir. ¿Cómo escribo una string
a char* c
. El objetivo es ejecutar comandos de Unix como ps , etc., ejecutando solo el programa.
Pensé escribir el puntero EBI con la representación hexadecimal de ps y establecer la lista arg de shell_call
a eso, pero eso no funcionó. También traté de argsv
argumentos argsv
y establecer la lista arg de shell_call
en arg_list
de main, pero tampoco funcionó.
Creo que la segunda versión debería funcionar, pero creo que no estoy configurando la lista arg del nuevo marco de pila correctamente (lo hice escribiendo a[8]
en 0
, ya que es la primera parte del puntero a la función, y escribir a[9]=736c
y a[10]=0000
, pero probablemente no sea correcto, ya que esos son los parámetros de victim_func
. Entonces, ¿cómo puedo acceder a los parámetros de shell_call
?
Probablemente no debería hacer tu tarea por ti. Pero básicamente
Necesita almacenar un búfer de caracteres en algún lugar de la memoria para almacenar la cadena que desea ejecutar. Obviamente, puede hacer esto de la misma forma que recibe las otras funciones llamadas (es decir, también coloca el texto en la pila). Después de tener eso escrito, debe escribir un puntero en la pila en la ubicación en que la función shell_code espera encontrar sus argumentos.
La mejor manera de resolver esto sin que yo haga todo el trabajo por usted es anotar sus contenidos de pila / memoria en una hoja de papel / pizarra. Escriba cómo se vería si llamara normalmente a shell_code desde el interior del programa. Luego anote cómo es la pila dentro de victum_func y descubra qué cosas cambiar para que parezca que se vería "naturalmente" (por supuesto, teniendo en cuenta que algunas cosas son "no me importa" como la dirección de retorno).
¡Esa es toda la caridad que obtendrás de mí hoy! :-PAG
Debes manipular el marco de la pila de la persona que llama ( main()
), y organizarlo de tal manera que al volver a shell_call()
desde el epilog de la victim_func()
este último pueda encontrar una pila resuelta tal como fue llamado por el principal.
Al hacerlo, es probable que tenga que manipular el puntero de marco en el fotograma de pila de la víctima, que se restaurará en% ebp mediante leave
.
SoapBox ya hizo un gran trabajo al guiarte en la dirección correcta.
Para más información; http://www.skullsecurity.org/wiki/index.php/Example_4