Uke 7 - Assembly og Shell-scripting

Oppgaver til mandag 10. - fredag 14. feb

Oppgavene denne uken skal først leveres i oblig 2.

Først flere oppgaver om hvordan høynivåkode faktisk blir kjørt på en datamaskin. Dette er det viktig å vite for å senere forstå hvordan operativsystemet styrer alle prosessene som kjører. Deretter litt mer avanserte shell-script.

  1. (Oblig) Les 5.2 'En linje høynivåkode kan gi flere linjer maskininstruksjoner' i Forelesningsnotatene. Kompiler deretter programmene, C-koden main og assembly-koden en.s (den som starter med .globl enlinje). Vis så at en kjøring gir svaret 42 og forklar så hvorfor svaret blir 42 utifra assembly-koden. NB! Siden tidligere har default konfigurasjon av kompilatoren gcc endret seg, slik at du nå må legge på opsjonen -no-pie når du kompilerer; det vil si gcc -no-pie main.c en.s. Hvis ikke får du en feilmelding om relocation R_X86_64_32S against `.data' can not be used.
  2. (Oblig) Bruk så det C-programet som gjør det samme som assembly-koden i forrige oppgave(deklarer int-variabler svar og memvar), kompiler det sammen med main C-programmet på samme måte og sjekk at svaret blir det samme. Kompiler C-funksjonen alene med gcc -S og studer den resulterende assembly-koden. Hvor mange linjer leder den ene høynivå-koden til? Hvordan endrer den resulterende assembly-koden seg om du bruker "long long" istedet for "int" for variablene i C-funksjonen?

    Hint: Bruk C-funksjonen enlinje() fra avsnitt 5.2. Hvis du kaller hovedprogrammet main.c og funksjonen enlinje.c, skal de kunne kompileres og kjøres med

    $ gcc main.c enlinje.c
    $ ./a.out
    Kaller enlinje()...
    Svar = 42
      
    Du kan så lage assembly-kode av C-funksjonen ved
        $ gcc -S enlinje.c
      
    Det er den resulterende funksjonen enlinje.s du skal studere og prøve å finne ut hva C-linjen
    svar = svar + memvar
      
    i enlinje.c blir oversatt til i assembly-koden som gcc produserer.

  3. Ukens utfordring nr. 1: Ta utgangspunkt i if-testen skrevet i Assembly fra forelesningen hvor variabelen svar er defintert og skriv et Assembly-program som
     Returnerer 1 hvis svar > 0
     Returnerer -1 hvis svar < 0
     Returnerer ellers 0
      
    NB! Siden tidligere har default konfigurasjon av kompilatoren gcc endret seg, slik at du nå må legge på opsjonen -no-pie når du kompilerer; det vil si gcc -no-pie main.c if.s. Hvis ikke får du en feilmelding om relocation R_X86_64_32S against `.data' can not be used.
  4. Ukens utfordring nr. 2: Lag en assemblymetode as.s som returnerer tall nr 46 i Fibonacci-rekken 1, 1, 2, 3, 5, 8, 13,... Lag en tilsvarende metode skrevet i C og test at resultatet stemmer. Hva skjer om du regner ut tall nr 47 i rekken? Hvorfor skjer dette? Prøv å endre type fra int til long long og om du da kan klare å regne ut tall nr 92 i rekken. Hva skjer om du regner ut tall nr 93? Hvorfor skjer dette? Når denne oppgaven ble gitt for tre år siden sto det at man skulle regne ut tall nr 1000 i Fibonacci-rekken, men dett tallet er 43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875 og det er utenfor pensum å regne ut så store tall...
  5. (Oblig) Gjør først et forsøk på å løse forrige oppgave om å lage tall nr 46 i Fibonacci-rekken. Om du ikke får det til, be om hjelp fra Sikt KI-chat https://ki-chat.sikt.no/nb til programmeringen, kjør programmene og svar deretter på spørsmålene i oppgaven.
  6. Ta utgangspunkt i hash-strengen
    $6$AB.f/K06$IsV3oABaBO4UEBertVwViFgqFcuRvPfBDBVojDJkwg43AlPlgfD.y8nCpjnb01EgwwrVaxpYRzYjgT5G1g4lw.
    
    som er hentet fra shadow-filen på en Linux-server. Passordet er laget med små bokstaver og er bare tre tegn langt. Lag et shell-script som bruker kommandoen mkpasswd til å regne ut hash-verdien for alle mulige kombinasjoner av ord med tre små bokstaver mellom a og z. Det vil si aaa, aab, aac, etc. Få scriptet til å sammenligne med hash-strengen over slik at du dermed cracker passordet!

    Hint: se hva for p in {a..z}{a..z}; do echo $p; done gir. Generelt kan lengden på saltet variere, men kommandoen cut kan brukes til å trekke ut strenger mellom $-tegnene i hashen. Opsjonen -s til kommandoen mkpasswd kan brukes til å lese passordet fra STDIN (slik at du med echo kan pipe passordet til kommandoen).

  7. (Oblig) Gjør først et forsøk på forrige oppgave om å finne det hemmelige passordet. Hvis du ikke får det til, be om hjelp fra Sikt KI-chat https://ki-chat.sikt.no/nb til programmeringen og prøv å cracke passordet. Hvis du ikke fikk til kodingen selv, studer løsningen som ble laget, prøv å forstå koden og finn ut hvor og hvorfor du ikke kom videre.
  8. Prøv å forklare resultatene av følgende kommandoene.
    echo dette er en test | sed s/test/fisk/
    echo test og test | sed s/test/fisk/
    echo test og test | sed s/test/fisk/g
    echo test og test | sed s@test@fisk@g
    echo `pwd` | sed s///:/g      # (prøver å bytte ut / med : )
    echo `pwd` | sed s@/@:@g
    echo `pwd` | sed s/\[/\]/:/g  # gir det samme som forrige
    find ~ -mtime +1 -print
    find ~ -mtime 0 -exec file {} \;
    
    data2500$ for variable in $(find ~ -name '.*' -print)
    > do
    > echo Hidden file/directory $variable
    > file $variable
    > echo ------------------------------
    > done
    
    Hint: bruk manualsidene til å finne ut litt om disse kommandoene.
  9. (Oblig) Lag en find-kommando på data2500 som lister alle filene i hjemmemappen din som ble endret i løpet av 30 januar 2024. (velg en annen dato å teste med hvis du ikke har endret noen filer denne dagen)
  10. (Oblig) Lag en fil med navn fil.txt som inneholder
    s802399@stud.hioa.no
    s886878@stud.hioa.no
    s886876@stud.hioa.no
    s886885@stud.hioa.no
    s886884@stud.hioa.no
    s850806@stud.hioa.no
    s886873@stud.hioa.no
    s886888@stud.hioa.no
    s808855@stud.hioa.no
    s856627@stud.hioa.no
    s886878@stud.hioa.no
    s299507@stud.hioa.no
    s850798@stud.hioa.no
    s803434@stud.hioa.no
    s886879@stud.hioa.no
    s886877@stud.hioa.no
    s959938@stud.hioa.no
    s886880@stud.hioa.no
    s826650@stud.hioa.no
    s886882@stud.hioa.no
    s886874@stud.hioa.no
    s859987@stud.hioa.no
    s803833@stud.hioa.no
    s886885@stud.hioa.no
      
    Lag så en kommando som fra denn filen lager en ny fil nyfil.txt hvor alle forekomster av stud.hioa.no er byttet ut med oslomet.no
  11. Ta utgangspunkt i en fil med navn fil.txt som inneholder listen
    Arfan    Ali    s802399    s802399@stud.hioa.no    personbilde    JA
    Ali    Muhammad Usman    s886878    s886878@stud.hioa.no    personbilde    JA
    Gupta    Suraj    s886876    s886876@stud.hioa.no    personbilde    NEI
    Olaussen    Marius Glenn    s886885    s886885@stud.hioa.no    personbilde    JA
    Rornes    Eirik Johannes    s886884    s886884@stud.hioa.no    personbilde    JA
    Awale    Bikram    s850806    s850806@stud.hioa.no    personbilde    JA
    Gjoka    Perla    s886873    s886873@stud.hioa.no    personbilde    NEI
    Pirzada    Abu Hurrera    s886888    s886888@stud.hioa.no    personbilde    NEI
    Nguyen    Norah Elisabeth    s808855    s808855@stud.hioa.no    personbilde    NEI
    Abueleis    Nihal    s856627    s856627@stud.hioa.no    personbilde    NEI
    Khan    Imran Qayyum    s886878    s886878@stud.hioa.no    personbilde    NEI
    Smedsrud    Kim    s299507    s299507@stud.hioa.no    personbilde    JA
    Shahmir Shourmasti    Komail    s850798    s850798@stud.hioa.no    personbilde    JA
    Gundersen    Martin Bergheim    s803434    s803434@stud.hioa.no    personbilde    JA
    Khatiwada    Baijaya    s886879    s886879@stud.hioa.no    personbilde    JA
    Jani    Tea    s886877    s886877@stud.hioa.no    personbilde    NEI
    Wiken    Stian Leander    s959938    s959938@stud.hioa.no    personbilde    NEI
    Klausen    Magnus    s886880    s886880@stud.hioa.no    personbilde    JA
    Pandey    Siddhartha    s826650    s826650@stud.hioa.no    personbilde    JA
    Mahmood    Tariq    s886882    s886882@stud.hioa.no    personbilde    JA
    Celiku    Lea    s886874    s886874@stud.hioa.no    personbilde    JA
    KOMANPALLY    NIRANJANI REDDY    s859987    s859987@stud.hioa.no    personbilde    JA
    Toien    Fredrik Karlsen    s803833    s803833@stud.hioa.no    personbilde    JA
    Shahid    Shahid Iqbal    s886883    s886885@stud.hioa.no    personbilde    NEI
      
    og gi en kommando som gir en fil nyfil.txt som inneholder
    s802399@oslomet.no
    s886878@oslomet.no
    s886876@oslomet.no
    etc.
      
    Hint: test | awk '{print $(NF-2)}' på en linje i filen.
  12. (Oblig) Lag en enlinjes Linux-kommando som skriver ut en liste med de 10 største filene i /etc, omtrent slik (på data2500):
    -rw-r--r-- 1 root root   70481 Jan 15  2021 mime.types
    -rw-r--r-- 1 root root   26599 Jan 25 06:44 ld.so.cache
    -rw-r--r-- 1 root root   12813 Mar 27  2021 services
    -rw-r--r-- 1 root root   10593 Jan 30  2021 sensors3.conf
    -rw-r--r-- 1 root root   10477 Feb  7  2020 login.defs
    -rw-r--r-- 1 root root   10056 Dec  2  2020 nanorc
    -rw-r--r-- 1 root root    9443 Jan  2 23:35 locale.gen
    -rw-r--r-- 1 root root    6169 Feb 27  2021 sudo_logsrvd.conf
    -rw-r--r-- 1 root root    5662 Dec 31 21:14 ca-certificates.conf
    -rw-r--r-- 1 root root    5215 Feb 19  2021 manpath.config
      
  13. Lag et script som for hver bruker som har sitt shell definert som /bin/false skriver ut pid til alle prosesser denne brukeren kjører på systemet. På data2500 vil det kunne se omtrent slik ut:
    haugerud@data2500:~$ ./false.sh 
    _chrony har pid=507
    _chrony har pid=508
    zabbix har pid=586821
    zabbix har pid=586824
    zabbix har pid=586825
    zabbix har pid=586826
    zabbix har pid=586827
    zabbix har pid=586828
    
    Hint: Se avsnitt 5.7 i forelesningsnotatene, "Lese filer og output med while og read".
  14. Lag et bash-script som skriver ut en oversikt tilsvarende den som er gitt nedenfor. All informasjon skal genereres dynamisk av scriptet og vil dermed avhenge av hvem som kjører det, hva scriptet heter, hvor det kjøres etc. Bruk scriptet fra forrige uke som teller filer og linker i dette scriptet (Hint: finn ut hva shell-variablene $0 og $$ er).
    haugerud@data2500:~$ ./info.sh 
    Du har brukernavn haugerud og kjører scriptet ./info.sh med PID = 816133 
    på maskinen data2500 som kjører operativsystemet Linux
    Oversikt over din hjemmekatalog /home/haugerud:
    Filer: 95
    Kataloger: 14
    Linker: 0
    Ditt default shell er /bin/bash og du befinner deg i 
    katalogen /home/haugerud
    Totalt 32 brukere er oppført i passordfilen og det er definert 58 grupper
    Oversikt over dine grupper:
    haugerud : groups: cannot find name for group ID 101964
    101964 sudo
    
  15. Ukens nøtt nr. 1: Lag et script som på data2500 leser de 5 første linjene av /etc/hosts og lager to array, ip og navn, som etter at scriptet er kjørt inneholder de 5 første IP-adressene og de fem første navnene i denne filen. Til slutt skal scriptet skrive ut lengden av arrayene og hva som ligger i tredje element i de to arrayene. Når det kjøres skal output se slik ut:
        $ ./arr.sh
    Totalt: 5
    Array 3: 128.39.89.23 nexus.cs.hioa.no
      
    Hint: Se avsnittet 'Et vanlig problem med pipe til while og read' i forelesningsnotatene om du bruker head -5 og ikke får noen verdier i arrayene. En annen måte å løse dette problemet på er å sende filen til while-read og så bruke en teller for å bare lese de første fem linjene.
  16. Ukens nøtt nr. 2: Lag et script som på data2500 leser de 5 første linjene av /etc/hosts og lager et assosiativt array, ip, som etter at scriptet er kjørt inneholder de 5 første IP-adressene og har de fem første navnene i denne filen som indeks i arrayet. Til slutt skal scriptet skrive ut lengden av arrayet og de fem elementene omtrent slik(rekkefølgen er ikke vesentlig):
    $ ./assarr.sh
    Totalt: 5
    nexus.cs.hioa.no sin IP er 128.39.89.23
    csstud.cs.hioa.no sin IP er 128.39.89.61
    ssh.cs.hioa.no sin IP er 128.39.89.11
    localhost sin IP er 127.0.0.1
    studssh.cs.hioa.no sin IP er 128.39.89.65
      
  17. (Oblig) Gjør først et forsøk på å løse forrige oppgave. Om du ikke får det til, be om hjelp fra Sikt KI-chat https://ki-chat.sikt.no/nb til programmeringen, kjør scriptet og test at det virker som det skal.
  18. Ukens nøtt nr. 3: Ta utgangspunkt i denne syslog-filen og lag et script som gir en sortert liste over for hvilke tidspunkt(hvilket sekund) det var flest events, basert på timestamp i kolonne nr 3. Første delen av output skal se ut som:
    $ ./parselog.sh < syslog.tmp 
    08:00:17 47
    08:30:17 37
    08:00:40 28
    08:30:16 20
    07:30:44 17
    
    Prøv også å lage et script som gir en tilsvarende liste pr minutt. Hint: Bruk timestamp som index i et assosiativt array, skriv ut arrayet og sorter etter antall events.
  19. (Oblig) Denne ukens OS-konkurranseoppgave går ut på å finne en fil som er skjult på en måte som ofte brukes av hackere for å gjøre det litt vanskligere å se filen. Filen som du skal finne er lagt inn i hjemmemappen til s-serveren inne i en mappe som det er lett å overse når du lister mapper. I tillegg har denne filen et uvanlig navn og inneholder ikke tekst-strengen du skal finne frem til i klartekst, du må gjøre noe med denne filen for å få ut tekststrengen med de 10 tegnene.

    Logg inn som tidligere med noe tilsvarende som følgende:

    $ ssh -p 5135 s135@intel3.vlab.cs.oslomet.no
    
    s135@intel3.vlab.cs.oslomet.no's password: 
    
    s135@os5135:~$ 
    

    For å sjekke at du har funnet det rette ordet, skriv strengen med 10 tegn inn på siden os.php uke7 og du får beskjed om du har skrevet riktig. I tilegg blir du da med på konkurransen om å finne denne koden fortest mulig!