Estoy escribiendo un ataque de retorno a libc para un proyecto escolar. Mi script recupera el sistema (), exit () y las direcciones de shell de la siguiente manera (es un script sh que llama a algunos programas c):
Crea la variable de entorno para el shell xh:
export egg=/bin/xh
Recupere la dirección del shell xh: printf("%p\n", getenv("egg"));
Obtenga la dirección del sistema (): void (*system_addr)(int) = dlsym(RTLD_NEXT, "system");
Obtenga la dirección de exit (): void (*exit_addr)(int) = dlsym(RTLD_NEXT, "exit");
Luego, desbordo el búfer con la cantidad correcta de relleno + dirección de system()
+ dirección de exit()
+ dirección de /bin/xh
.
El exploit está en una carpeta llamada /vuln_programs
. No podemos escribir en este directorio, así que estoy trabajando en una copia local en mi propio directorio en el servidor.
El problema es que cuando ejecuto el script en mi directorio de trabajo en mi copia local ( ./vuln_program
), el shell xh se elimina correctamente. Pero cuando ejecuto el script en mi directorio de trabajo en /vuln_programs/vuln_program
, no pasa nada.
Mi conjetura es que esto se debe a que, por alguna razón, la dirección del huevo ya no es la misma a pesar de que mi script la pone / recibe del entorno. ¿Tengo razón en esta suposición y cómo puedo resolver esto?
Puede ser importante tener en cuenta que todos los binarios en /vuln_programs
tienen un conjunto de bits setuid.