Sto scrivendo un attacco return-to-libc per un progetto scolastico. Il mio script recupera il sistema (), exit () e gli indirizzi della shell come segue (è uno sh script che chiama alcuni programmi c):
Crea la variabile d'ambiente per la shell xh:
export egg=/bin/xh
Recupera l'indirizzo della shell xh: printf("%p\n", getenv("egg"));
Ottieni l'indirizzo di system (): void (*system_addr)(int) = dlsym(RTLD_NEXT, "system");
Ottieni l'indirizzo di exit (): void (*exit_addr)(int) = dlsym(RTLD_NEXT, "exit");
Quindi overflow il buffer con la quantità corretta di filler + indirizzo di system()
+ indirizzo di exit()
+ indirizzo di /bin/xh
.
L'exploit si trova in una cartella chiamata /vuln_programs
. Non possiamo scrivere in questa directory, quindi sto lavorando su una copia locale nella mia directory sul server.
Il problema è che quando eseguo lo script nella mia directory di lavoro sulla mia copia locale ( ./vuln_program
), la shell xh viene rilasciata correttamente. Ma quando eseguo lo script nella mia directory di lavoro su /vuln_programs/vuln_program
non succede nulla.
La mia ipotesi è che questo sia dovuto al fatto che l'indirizzo dell'uovo non è più lo stesso, anche se il mio script lo inserisce / ottiene nell'ambiente. Ho ragione su questa ipotesi e come posso risolvere questo?
Potrebbe essere importante notare che tutti i binari in /vuln_programs
hanno un set set bit bit.