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/unameAngi 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 ./luckgoForklar 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 serverScriptet 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-numbersskriver 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? |
|
b) Hva blir output med følgende filer? |
|
c) Semaforer brukes for å oppnå gjensidig utelukkelse. Hva blir output med følgende filer? |
|
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/lockfileForklar 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
fraPort-tilPort
er en gyldig serie portnummere
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 tilkoblingog 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-