2009-11-15 15 views
8

Jestem trochę zagubiony w idei wstrzykiwania kodu w C. Jeśli ktoś mógłby to wyjaśnić i pokazać, jak to się robi, byłbym wdzięczny.Zrozumienie i robienie wtrysku kodu w C

Więc powiedzmy, że w C masz tablicę Char o rozmiarze 512, która jest zapisywana do zawartości gniazda o długości 1024, i że tablica znaków zawiera teraz jakiś kod, ale tylko połowę tego, co zostało napisane.

W jaki sposób jest wykonywany złośliwy kod w przepełnieniu bufora, myślę, że jestem zdezorientowany na strukturze procesu (stos, stertę, dane, tekst).

+3

Możesz zaakceptować odpowiedzi na niektóre wcześniejsze pytania, klikając pole wyboru obok prawidłowej odpowiedzi. –

+0

Dzięki chłopaki, nawet nie wiedziałem o tej funkcji. – Recursion

Odpowiedz

8

Ogólna sztuczka dotyczy sposobu, w jaki kod programu i zmienne są ułożone w pamięci. Na przykład, gdy wywoływana jest funkcja, program (kod wstawiony przez kompilator) musi zapamiętać adres instrukcji, do której ma wrócić. Więc jeśli jest to słowo 32 bitowe tuż przed rozpoczęciem stosu, można zrobić:

void foo() 
{ 
    int array[5]; 
    int var = 0; 
    int var2 = 0; 

    // read in user input 
    printf("Enter index and value to write:"); 
    scanf("%i", var); 
    scanf("%i", var2); 

    // malicious user might set var to -1 and var2 to an address to execute 
    // if say the 32-bit value before the stack variables is the instruction to 
    // return to 
    array[var] = var2 

    // return now goes to malicious code 
} 

(. Tak więc twoim zadaniem jest zbudować kod tak, że coś takiego nie jest możliwe :))

Reguły dotyczące implementacji wywołania funkcji, przydzielonych zmiennych stosów, wartości przekazanych i zwracanych wartości zwane są calling convention. Polecam przeczytanie załączonego artykułu, aby uzyskać dobre i wyczerpujące informacje o konwencjach wywołujących C.

0

Typowa stos dla każdego podprogramu może wyglądać tak:

  • parametrów (wartości, które zostały przyjęte jako parametry do podprogramu)
  • powrotnego adresu (adres z kodów, z których ta procedura została wywołana)
  • zapisane wartości rejestru
  • zmienne lokalne

Jeżeli podprogram posiada lokalną variabl e, i jakoś wypisz za koniec zmiennej lokalnej, a następnie nadpisuje wartości (na stosie), takie jak adres powrotu, tj. adres kodu, który zostanie wykonany na końcu podprogramu, gdy podprogram wykonuje "powrót ".

2

Po przydzieleniu bufora na stosie i jego przepełnieniu zostanie on zapisany na stosie. Stos zawiera wskaźnik powrotu dla funkcji, która przydzieliła bufor. Tak więc, jeśli przepełnisz bufor na stosie, możesz ustawić wskaźnik powrotu na coś arbitralnego; co daje ci kontrolę nad wątkiem wykonania.

Co do faktycznego wstrzyknięcia kodu, to zależy. Stos - a raczej strona zawierająca go - jest często ustawiony, aby nie pozwolić na wykonanie kodu; ale historycznie możliwe byłoby przechowywanie małych złośliwych programów w samym buforze na stosie. Return oriented programming to całkiem nowy wariant ataku return-to-libc, z których oba działają na bitach NX.