Eksamen vår 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 2 teller 15%, oppgave 3, 4 og 5 teller 25%. Innenfor hver oppgave vil deloppgavene telle omtrent likt. 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 utifra dem.

Oppgave 1

I denne oppgaven skal du i delspørsmål a) og b) 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 f.eks. mkdir kat hvis du blir spurt: Opprett en katalog med navn kat).

a) Gi en kommando som kopierer filen scan.pl i katalogen /tmp til katalogen du står i.

b) Gi en kommando som for filen scan.pl i katalogen du står gir: alle rettigheter til eieren, kun lese og kjøre-rettigheter til gruppen og kun kjøre-rettigheter til andre brukere.

c) To ls-kommandoer på en Linux-maskin gir følgende:

$ ls -la /
drwxr-xr-x   20 root     root         1024 Jan 22 18:01 .
drwxr-xr-x    2 root     root         2048 Jul 25  2002 bin
drwxrwxrwx  313 root     root        29696 Feb 18 13:35 tmp
$ ls -l /bin/uname
-rwxr-xr-x    1 root     root        10396 Jul 26  2001 /bin/uname
Angi med nummer hvilke av de følgende Linux-kommandoene som vil gi en meldingen som 'Permission denied' eller lignende når de blir utført av en vanlig bruker:
1 $ cp /bin/uname ~
2 $ /bin/uname
3 $ mv /bin/uname /tmp
4 $ cat /bin/uname > /tmp/uname
5 $ chmod 700 /tmp
6 $ cp /bin/uname /

d) I en såkalt honeypot som lagrer alle kommandoer som en hacker gjør etter ett innbrudd, ble følgende kommandoer utført i en tom katalog etter at hackerverktøyet luckroot.tgz ble lastet ned fra nettet:

tar xfz luckroot.tgz
cd luckroot
./luckgo
Forklar kort hva hackeren gjør.

Oppgave 2

Lag et bash-script portnavn.bash som tar ett argument fra kommandolinjen og betrakter argumentet som et portnummer. Hvis ingen eller flere enn ett argument gis, skal scriptet avslutte med feilmeldingen: "Syntaks: portnavn.bash portnummer". Scriptet skal lese filen /etc/services og finne ut om det er en tcp-tjeneste som har dette portnummeret. Alle tcp-tjenester som står i filen er oppført med linjer som

ftp             21/tcp
ssh             22/tcp                          # SSH Remote Login Protocol
telnet          23/tcp
domain          53/tcp          nameserver      # name-domain server
Scriptet skal finne linjen med portnummeret som er oppgitt og hvis en slik linje finnes, skrive ut følgende linje:
TCP-tjenesten 'navn' er på port 'portnummer'
der 'navn' er navnet på tjenesten hentet fra det første ordet på linjen. Med en gang linjen er skrevet ut, skal scriptet avslutte. Hvis det oppgitte portnummeret ikke finnes i /etc/services, skal scriptet lese en web-side som har nøyaktig samme form og som inneholder mange flere portnummer. Linux-kommandoen
lynx -source http://www.iana.org/assignments/port-numbers
skriver innholdet av denne siden til STDOUT (default til skjermen, på samme måte som cat /etc/services). Hvis portnummeret finnes på denne siden, skal samme info-linje skrives ut som angitt ovenfor. I tillegg skal linjen starte med 'IANA: '.

Oppgave 3

De første tre deloppgavene i denne oppgaven dreier seg om OS-simuleringen i den andre obligatoriske oppgaven. OS kjører de to prosessene Proc 1 og Proc 2 definert ved filene proc1.txt og proc2.txt. Første linje i filene angir prioritet, de neste er kommandoer som skal utføres ved å skrive den til skjermen. Bare kommandoene fork, signal og wait tolkes av OS.

a) Det simulerte operativsystemet skal kjøre de to prosessene Proc 1 og Proc 2 definert ved filene proc1.txt og proc2.txt. Hva blir output?
proc1.txt proc2.txt
1 2
print 1 start 1
echo 2 print 2
end 3 exit 3


b) Hva blir output med følgende filer?
proc1.txt proc2.txt
1 1
print 1 fork 1
echo 2 fork 2
end 3 exit 3


c) Semaforer brukes for å oppnå gjensidig utelukkelse. Hva blir output med følgende filer?
proc1.txt proc2.txt
1 1
wait 1 add 1
critical 2 wait 1
critical 3 crit 3
signal 1 crit 4
stop 5 signal 1
  exit 5


d) Hva er et kritisk avsnitt? Forklar kort.

e) Hva er busy-waiting? Forklar kort.

f) Anta at et Perl program som kan startes fra web bruker følgende metode for å unngå at to brukere skriver samtidig til en fil

while(-f /tmp/lockfile) {}
`touch /tmp/lockfile`;   # Lager /tmp/lockfile
# skriver til en felles fil
`rm /tmp/lockfile`;      # Fjerner /tmp/lockfile
Forklar kort ideen bak denne metoden. I hvilket tilfelle virker den ikke?

g) Forklar kort hvordan følgende Mutex-algoritme mellom to prosesser virker. Hva gjør den ubrukelig?

static boolean[] flag = new boolean[2]; // Begge false i utgangspunktet
GetMutex(int t)
{
   int other;
   other = 1 - t;
   flag[t] = true; // Ønsker å gå inn i kritisk avsnitt
   while (flag[other] == true){}
}
 
ReleaseMutex(int t)
{
   flag[t] = false;
}

Oppgave 4

I denne oppgaven skal du skrive tre Perl-subrutiner som skal kjøres på en Linux-maskin og som skal brukes i neste oppgave (ikke skriv dem på nytt der!). Subrutinen i deloppgave a) skal brukes i b) og c).

a) Lag en Perl-subrutine erTall() som tar tre argumenter. Den skal sjekke at det første argumentet er et positivt heltall eller null. Bruk et regulært uttrykk til å kontrollere at argumentet kun består av siffer. Hvis det første argumentet er et slikt tall og det er større enn argument nummer to og mindre enn argument nummer 3, skal subrutinen returnere strengen "OK". I alle andre tilfeller skal ingenting returneres.

b) Lag en subrutine portOK() som tar en streng som eneste argument. Argumentet skal være på formen "tallA-tallB" der tallA og tallB er heltall større enn null og mindre enn 65536. Hvis i tillegg tallB er større eller lik tallA, skal subrutinen returnere et array med tallA og tallB som de to første og eneste elementene. Hvis ikke skal et array med to nuller returneres. Bruk subrutinen erTall() fra deloppgave a) til å sjekke tallene.

c) Lag en subrutine IPOK som tar en IP-adresse som argument. Den skal returnere strengen "OK" hvis IP-adressen er på formen "A.B.C.D" der A, B, C og D er null eller positive heltall mindre enn 256. I alle andre tilfeller skal ingenting returneres. Bruk subrutinen erTall() fra deloppgave a) til å sjekke tallene.

Oppgave 5

Når en hacker prøver å bryte seg inn på en maskin på Internett, er vanligvis det første han (enten finnes det ikke kvinnelige hackere, eller så er de så dyktige at de aldri blir tatt :-) gjør å kjøre en port-scanning mot IP-adressen til maskinen som angripes. Det vil si å kjøre et program som prøver å koble seg opp mot et antall porter for å finne ut hvilke tjenester som kjører på denne maskinen.

Lag et Perl-program scan.pl som gjør dette for en IP-adresse og en serie portnummere som blir angitt ved to argumenter. Programmet skal ha syntaks scan.pl IP fraPort-tilPort og avsluttes med en melding om riktig syntaks hvis ikke nøyaktig to argumenter angis av brukeren. Bruk subrutinene fra forrige oppgave til å finne ut om

Hvis dette ikke er tilfellet, skal programmet avsluttes med en passende feilmelding.

For hver port fra og med "fraPort" og til og med "medPort" skal programmet lage en klient-socket mot IP-adressen og koble seg opp mot serveren. Hvis oppkoblingen lykkes, skal programmet skrive ut en linje på formen

TCP-tjenesten 'navn' er på port 'portnummer' og er åpen for tilkobling
og forbindelsen avbrytes med en gang. Informasjonen i første del av linjen (før 'og') skal hentes ved å bruke bash-scriptet portnavn.bash fra oppgave 2. Du kan anta at scriptet ligger i katalogen /bin. Hvis oppkoblingen feiler, skal ingenting skrives ut, men en linje som angir antall lukkede porter skal skrives ut når programmet er ferdig.

Eksempler på bruk av scan.pl:

$ scan.pl 128.39.89.10 35-21
Port-angivelsen 35-21 er ikke gyldig

$ scan.pl 128.39.89.10 21-35
TCP-tjenesten ftp er på port 21 og er åpen for tilkobling
TCP-tjenesten ssh er på port 22 og er åpen for tilkobling
TCP-tjenesten smtp er på port 25 og er åpen for tilkobling
Det var 12 porter som var lukket

-SLUTT-



Hårek Haugerud 2003-02-21