Problemi nella creazione di una catena ROP

8

Sto cercando di sfruttare un piccolo programma. Il programma sembra un po 'come questo:

int func(void) {
    char text[100];
    scanf("%s", text);
    return 0;
}


int foo(unsigned short rand) {
    char RandomBuffer[rand];
    return func();
}


int main(int argc, char* args[]) {
srand(time(NULL));
    return foo(rand() % 1000);
}

Ho usato ROPgadget per costruire una catena ROP. Lo strumento trova un gadget necessario per l'attacco:

 Gadget found: 0x8058fcc pop edx ; ret

La mia catena ROP inizia così:

p = ‘rnd padding’
p += pack('<I', 0x08058fcc) # pop edx ; ret

Tuttavia quando eseguo il mio exploit ottengo:

Stopped reason: SIGILL
0x08058fcc in _int_memalign ()

L'EIP punta all'indirizzo calcolato da ROPgadget ma in qualche modo non è il comando corretto.

EIP: 0x8058fcc (<_int_memalign+108>:    lock mov eax,esi)

Cosa mi manca?

Saluti

    
posta alive-and-well 04.07.2017 - 13:24
fonte

2 risposte

1

Senza ulteriori analisi è difficile determinare la causa esatta di questo. Un problema comune è che l'esecuzione dell'applicazione in un debugger modifica leggermente il layout della memoria e può essere sufficiente per interrompere l'exploit con / senza un debugger collegato. Hai provato a eseguirlo senza un debugger collegato e quindi analizzando il core dump?

Tuttavia, pop edx;ret non dovrebbe essere eccessivamente difficile da trovare, a un altro indirizzo o tramite un gadget leggermente più lungo come pop edx; pop eax; ret . Mettere insieme una catena ROP è un puzzle e c'è più di un modo per farlo.

    
risposta data 13.07.2017 - 04:42
fonte
1

Probabilmente manchi PIE / ASLR, il che rende il caricatore posizionare il tuo eseguibile su un indirizzo diverso ogni volta che viene eseguito, il che a sua volta significa che il tuo gadget si troverà a un indirizzo diverso ogni volta. Guarda nel tuo compilatore se c'è un modo per disabilitarlo. Molte build gcc usano, ad esempio, -no-pie. In caso contrario, potresti essere in grado di disabilitare ASLR per l'intero ambiente. Questo è diverso nelle diverse versioni di Linux, ma il modo più comune (credo) è

sudo bash -c 'echo 0 > /proc/sys/kernel/randomize_va_space'
    
risposta data 15.08.2017 - 09:02
fonte

Leggi altre domande sui tag