I Gruppe(r): I I JI G høgskolen i oslo Emne: Operativsystemer og UNIX Emnekode: SOl35A i Faglig veileder: Hårek Haugerud 2.klassene, DATA Dato: 11.12.2003 Eksamensoppgav Antall sider (inkl. Antall op~gaver: en består av: forsiden): 5 Eksamenstid: 09.00-12.00 Antall vedlegg: O Tillatte hjelpemidler: Alle trykte og skrevne hjelpemidler Kandidaten må selv kontrollere at oppgavesettet er fullstendig. Ved eventuelle uklarheter i oppgaveteksten skal du redegjøre for de forutsetninger du legger til grunn for løsningen. Avdeling for Ingeniørutdanning. Cort Adelersgate 30. 0254 Oslo. tlf: 22 45 3200. faks: 22 45 32 05. iu@hio.no
Eksamen høst 2003 Operativsystemer og UNIX Les nøye gjennom oppgavene før du begynner og pass på å besvare alle spørsmålene. Alle trykte og skrevne hjelpemidler er tillatt. Oppgavene vil ikke bli vektlagt likt ved sensur. En sannsynlig fordeling er at oppgave 1 teller 10%, oppgave ~ teller 35%, oppgave 3, ~O%, oppgave,l, 15% og 5 teller ~O%. De som ønsker det kan besvare oppgavene eller deler av oppgavene på engelsk. Sett gjerne egne forutsetninger dersom du synes oppgaveteksten er uklar. Beskriv forutsetningene og løs oppgaven utijra dem. NB! Tekstens apostrofer: ( er en liten \ mens J er en liten / Oppgave 1 I denne oppgaven skal du i delspørsmål a) til d) løse problemet ved å angi en kommando på en linje, slik du ville ha tastet den inn til bash på en Linux-maskin fra tastaturet (du svarer for eksempel mkdir kat hvis du blir spurt: Opprett en katalog med navn kat). a) Gi en kommando som flytter deg til katalogen /usr/bin. b) Gi en kommando som kopierer alle filer i katalogen du står i til www i din hjemmekatalog. c) Finn ut hvilke kataloger som er i din $PATH. d) Du leser en webside på gnu. arg. Finn ut hvilke gateways de pakkene du sender ut er innom på veien til gnu. arg. gateways pakker som du sender til gnu.org er innom på veien. e) Hva blir output av kommandoen echo It'dirname /usr/bin/emacs'/'basename /usr/bin/emacs'lt f) $ man awk gir blant annet: Records and fields Records are read in one at a time, and stored in the variable $0. The record is split into fields vhich are stored in $1, $2,..., $MF. The built-in variable MF is set to the number of fields. Gitt følgende: $ ls -l /usr/bid./emacs lrwxrvxrvx 1 23 Jan 22 2003/usr/bin/emacs -) /etc/alternatives/emacs Hva blir output fra kommandoen la -l!uar!bin!_ca avk '{print.mf}' g). dirs"-/deleted" S echo.dir -/deleted. cd -/deleted. cd.dir bash: cd: -/deleted: lo auch file or directory Forklar hvorfor cd -/ deleted går bra mens cd $dir feiler. 1
Oppgave 2 a) Lag et bash-script med navn vhere som tar ett og bare ett argument og som ellers avslutter med en feilmelding. Scriptet skal tolke argumentet som et programnavn og finne ut om det ligger et kjørbart program i.path med dette navnet. Hvis det gjør det skal det skrive ut full path til programmet og avslutte letingen. Hvis argumentet ikke er et program i $PATH skal ingen ting skrives ut. b) På et Linux-system forekommer det ofte at man må gå igjennom mange lag med linker for å finne ut hvilket program som egentlig kjøres når man gir en kommando. Ønsker man for eksempel å finne ut hvilket program som startes når man kjører emacs, kan man starte letingen med vhere-scriptet i forrige deloppgave. Det kan føre til følgende leteaksjon på maskinen cube: $ vbere emacs /usr/bin/_cs $ ls -l /usr/bin/emacs lrn:rvxrvx 1 $ la -l /etc/alterdatives/emaca lrvxrvzrvx 1. la -l /uar/bin/emaca21 lr.~.~.a 1. ls -l /uar/bin/emaca21.2 -rvxr-xr-x 1 23 Jan 22 2003 /usr/bin/emacs -> /etc/alternatives/emacs 16 May 30 2003 I.tc/al~.rna~ives/emacs -) lusr/biu/emaca21 10 Jan 22 2003 /uar/bid/emaca21 -> emaca-21.2 3978292 "ar 22 2002 lusr/bid/emacs-21.2 Legg merke til at full path måtte settes før emacs-21. 2 i den siste ls-kommandoen. Dette er tidkrevende og din oppgave går ut på å skrive et script delink som gjør dette automatisk. Anvendes delink på /usr /bin/ emacs, skal det søke nedover i linkene til det finner det underliggende programmet og gjøre en ls -l til programmet gitt med full path. Underveis skal linkene som besøkes listes slik: Sdelink /usr/bin/_cs 1 lrv~vxrvx 1 1rwxrvxrv% 1 -rvxr-xr-x 1 23 Jan 22 2003 /usr/bin/emacs -> /etc/alternatives/emacs 16 Kay 30 2003 /etc/alternatives/emacs -> /usr/bin/emacs21 10 Jan 22 2003 /usr/bin/emacs21 -> emacs-21.2 3978292 Kar 22 2002/usr/bin/emacs-21.2 Legg merke til at i 3. line av output fra delink står emacs-21. 2 linken uten full path. Pass på at scriptet takler dette når det søker nedover i linkene. Hvis argumentet til delink er en fil skal bare Is -1 for denne filen med full path skrives ut: $ delink /usr/bin/perl -rwxr-xr-x 3 $ 774947 Aug 10 03: 19 /var/hin/perl Hvis det viser seg at argumentet til delink er en link til en katalog, skal ikke den siste linjen vises, f. eks: $ d.link /var/mail lrvzrvxrwx 1 10 Jan 22 2003 /var/88il -) daemon.pool/mail I dette tilfellet er /var/spool/mail en katalog. Ingen output skal gis om man bruker delink direkte på en katalog, for eksempel/etc. Du kan anta at delink alltid mottar ett og bare ett argument. c) Lag et bash-script med navn show som tar ett og bare ett argument og ellers avslutter med en feilmelding. Det skal bruke de to foregående scriptene where og delink på en slik måte at hvis et kjørbart program som ligger i $PATH gis som argument til show, vil det gi full path til programmet. Altså: 2
$ show emacs -rvxr-xr-x 1 1 1 1 23 Jan 22 2003 /usr/bid/emacs -) /etc/alternatives/emacs 16 May 30 2003 /etc/alternative./emacs -) /usr/bin/emacs21 10 Jan 22 2003 /usr/bid/emacs21 -) emacs-21.2 3918292 Har 22 2002 /usr/bid/emacs-21.2 og $ shov ls -rvxr-xr-x 1 43784 Har 18 2002 /bin/la Hvis argumentet ikke ligger i $PATH, skal en feilmelding gis. Du kan anta at where og delink Oppgave 3 ligger i $PATH. I starten av denne oppgaven skal vi se på prosesser som multitaskes, men som må serialiseres når de bruker en felles variabel. a) Hva er et kritisk avsnitt. Forklar kort. b) Hva er en semafor. Forklar kort. c) En semafor som er initialisert til 8=1, brukes av 3 prosesser som jobber mot en felles variabel. Prosessene kaller alltid først vait, gjør et antall instruksjoner og kaller så signal. Forklar hvilke verdier 8 kan anta mens prosessene kjører. d) Forklar kort hvordan Linux-kommandoen nice virker inn på det som skjer i Round Robin-køen. e) Du og din nabo er koblet til samme HUB. Du kjører 8om Ethereal på din maskin. Naboen din bruker 8sh, ftp, ternet. For hvilke av de 3 appliaksjoene har du mulighet til å lese naboens passord? Forklar kort. f) Du og din nabo er koblet til samme Switch. Du kjører som Ethereal på din maskin. Naboen din bruker ssh, ftp og telnet. For hvilke av de 3 appliaksjoene har du mulighet til å lese naboens passord? Forklar kort. g) Gitt følgende: cube$ traceroute nexus traceroute to nexus.iu.hio.no (128.39.89.10), 30 hopa max, 38 byte packets 1 cadeler30-gv.uninett.no (128.39.74.0 0.769 as 0.696 as 0.579 as 2 nexus (128.39.89.10) 0.617 ma 0.443 ms 0.748 as Vil nexus motta cubes lp-adresse når cube sender pakker til nexus? Forklar kort. h) Vil nexus motta cubes MAC-adresse når cube sender pakker til nexus? Forklar kort. i) Hva er cadeler30-gw.uninett.no? Oppgave 4 I denne oppgaven skal du skrive to Perl subrutiner som skal brukes i den siste oppgaven til å lage en enkel Honeypot; en port-lytter. a) Lag en perl subrutine som tar en streng som argument. Denne strengen inneholder informasjon som skal legges til logg-filen honeypot.log. Anta at filen ligger i katalogen der programmet kjører. Hver nye 3
informasjonsstreng i logg-filen skal starte med et tids/dato stempel; bruk en innebygd Perl-funksjon. Logg-filen skal åpnes og lukkes for hver gang info skrives til filen. Bruk lokale variabler. b) Linux-kommandoen ljd% -source http://vvv.iana.org/assigaments/port-numbers gir blant annet informasjon om tcp-tjenester med linjer som ftp aah tehet amtp 21/tcp 22/tcp 23/tcp 25/tcp File Transfer [Control] SSB Remote Login Protocol Telnet Simple Mail Transfer Det er kun linjer på denne formen som inneholder strengen /tcp. Skriv en Perl subrutine GetServiceNamesom tar tar imot to parametre, min og max. Rutinen skal returnere et array indeksert med tcp-portnummere som ikke skal være mindre enn min og ikke større enn max. Verdien av arrayet med for eksempel index 22 skal være info om tcp-tjenesten med dette nummeret. I dette tilfellet strengen 'ssh(ssh Remote Login Protocol)' og tilsvarende for andre portnummere. Om det er portnummere mellom min og maks det ikke finnes info for, skal disse elementene ganske enkelt ikke defineres. Bruk lokale variabler. Oppgave 5 En Honeypot er en host som lokker til seg hackere og prøver å logge nøyaktig hva de gjør. En slik hast har i utgangspunktet ingen tjenester å tilby, så alle som prøver å komme inn bør betraktes som potensielle inntrengere. En port-lytter er den enkleste formen for Honeypot, et program som står og lytter på et antall porter og åpner en begrenset kommunikasjon hvis noen kobler seg til en port. I denne oppgaven skal du skrive en slik port-lytter ved å bruke Perl-sockets. Programmet skal selv definere verdien på to variabler $min og $max som bestemmer hvilke porter som det skallyttes på. Det vil si portene med nummer $min og.max og alle i mellom dem. For hvert portnummer skal programmet gjøre en fork ( ), slik at det startes en egen prosess for hvert portnummer og dermed for hver socket-forbindelse. Hver child-prosess skal åpne en server-socket på sitt portnummer. Hvis det ikke går, skal en passende feilmelding skrives ut. Hvis socket 'en kan opprettes og portnummeret for eksempel er 22, skal følgende informsajon skrives ut: Lytter på TCP-port 22 Bah (55B Remote Login Protocol) Informasjonen om t)enestenavnene skal hentes med subrutinen GetServiceNames fra forrige oppgave. Hver child-prosess skal sta i en evig løkke og vente på oppkoblinger. Hvis det kommer en opp~oblin~, skal den trekke ut lp-adressen til inntrengeren og prøve å lese ett buffer med et recv()-kall. Deretter skal forbmdelsen avsluttes og info, inkludert det leste bufferet, skrives til logg-filen ved hjelp av subrutinen vritelog fra forrige oppgave. Hvis det er en oppkobling på port 22 som sender 'heiiiii', skal følgende (eller tilsvarende) skrives til logg-filen: Tue Dec 9 14:07:47 2003 Tilkobling på TCP-port 22 (aah (SSH Re8ote Locin Protocol» fra 82.87.171.e9 heiiiii Husk at writelog selv legger på tidsstempelet. Du kan sette Reuse og Listen til 1 når du lager socket'ene og buffer-størrelsen til 1000. Det er mulig for en prosess å lage mange samtidige sockets med forskjellige portnummere, ved å bruke en egen IO::Select modul. Ser du noen fordeler/ulemper ved å bruke en slik metode i forhold til å fork'e? -SLUTT- 4