efinf:blc2016:hausaufgaben

Datenverarbeitung mir Ruby und Regular Expressions

Hintergrund ist die Idee von S. Knaus, den MAC-Adressen im Schulhaus zu lauschen, um einmal zu sehen, was für Daten daraus gewonnen werden können. Das Projekt wird eventuell ausgebaut und die Daten an verschiedenen Orten erhoben.

  1. Lesen nach, was eine “MAC-Adresse” ist. Sie sollten nachher verstehen:
    • Wie wird eine MAC-Adresse angegeben, aus wie vielen Bytes besteht sie?
    • Aus welchen 2 Teilen ist die MAC-Adresse zusammengesetzt?
    • Wie wird garantiert, dass diese weltweit eindeutig ist?
    • Kann die MAC-Adresse geändert werden (MAC-Spoofing)?
    • Finden Sie Ihre eigenen MAC-Adressen heraus (min 2 Netzwerkkarten im Laptop, 1 im Smartphone)
  2. Überfliegen Sie http://ruby-doc.org/core-2.2.0/Time.html (nützlich für das Ruby-Programm).
  3. Auf http://fginfo.ksbg.ch/~ivo/ef/ finden Sie zwei Dateien. Die eine (out.txt) enthält die offizielle Liste aller MAC-Prefixe mit Hersteller, die zweite (macscan.csv) enthält einen Mitschnitt aller MAC-Adressen, die von der Antenne im Schaukasten vor dem H47 an einem Tag detektiert wurden. Dieser Scan ist rein passiv, die Antenne sendet nichts, sondern “lauscht” nur, was die Geräte von sich geben.
  4. Entpacken Sie diese beiden Dateien.
  5. Schreiben Sie eine Ruby-Klasse, die die Datei oui.txt einliest und dann eine Methode get_company(mac) hat, die für eine Mac-Adresse den Herstellen liefert.
  6. Schreiben Sie ein Ruby-Programm, das die Datei macscan.csv einliest und die Daten aufbereitet, so dass Sie folgende Dinge beantworten können:
    • Für jedes 1-Minuten-Intervall, wie viele unterschiedliche MAC-Adressen wurden gesichtet? Geben Sie die Daten so aus, dass diese mit einem Programm als Kurve dargestellt werden kann (z.B. eine Tabellenkalkulation, oder gnuplot, octave, R, etc.).
    • Welcher Prozentsatz der MAC-Adressen kann Apple-Geräten zugeordnet werden?
    • Welche MAC-Adressen waren während einer ganzen Lektion immer wieder zu sehen? Welcher Klasse könnten diese wohl zugeordnet werden?
    • Sich weitere Fragestellungen zu diesen Daten überlegen und eventuell programmieren.
Lösungsvorschläge

Fragen zu DNS, IP-Adressen, Ports

  • Finden Sie heraus, welche IP-Adressen Ihre eigenen Geräte (inkl. Router) zu Hause haben (private wie öffentliche).
  • Wie gross ist Ihr Heimnetzwerk theoretisch (oder anders gefragt, wie viele Bits Ihre Netzmaske sind 0)?
  • Können Sie sich ein Angriffsszenario vorstellen, wo die Kenntnis Ihrer internen IP-Adressen (vom Internet aus nicht erreichbar) nützlich sein könnte?
  • Was kostet ein .ch-Domain pro Jahr? Wo?
  • Finden Sie heraus, wo www.ksbg.ch geographisch zu Hause ist.
  • Auf welchen Ports laufen standardmässige folgende Dienste: http, https, ssh, VoIP?
  • Was müssen Sie alles tun, damit Sie zu Hause Ihren eigenen Webserver betreiben könnten? Welche Services müssten Sie wohl einkaufen? Was müssten Sie zu Hause installieren bzw. konfigurieren?

einige Antworten

einige Antworten

IP-Adresse: Linux: ifconfig, Windows ipconfig. Zu Hause typischerweise 192.168.1.1 (router).

Typischweise 255.255.255.0 Netzmaske (24 Bit Netz, 8 Bit Host).

Angriffsszenario: Man bettet auf einer Webseite einen Link (z.B. Bild, wird automatisch geladen), das auf z.B. http://192.168.0.1/tolleURL?mit=parametern&die=etwas_dummes_auf_dem_router_anstellt

Es ist nicht unwahrscheinlich, dass der User noch mit Adminrechten auf dem Router angemeldet ist und die Anfrag an den Router erfolgreich durchgeht. Viele Router fragen aber vorher immer das Passwort ab, so dass dieser Angriff heute nicht mehr so erfolgreich ist.

www.ksbg.ch wird (laut https://www.iplocation.net/) in Irland gehostet. Zumindest steht dort der Server, der die Requests in die Amazon Cloud leitet. Die Daten können irgendwo auf dem Planeten liegen.

Port Numbers: Siehe auch https://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers

Dienst Port
http 80
https 443
ssh 22
voip 5060

Eigener Webserver zu Hause: Domain (oder Subdomain), Nameserver, der den Domainnamen auf die IP zu Hause auflöst. Idealerweise ist diese IP fix (kostet zwischen 100.- und 200.- im Jahr). Sonst muss bei jeder neuen Vergabe einer IP-Adresse der Nameserver entsprechend neu konfiguriert werden. Dazu gibt es Dienste (vor langer Zeit mal gratis, was heute läuft, keine Ahnung).

Damit ist die eigene IP vom Internet aus erreichbar. Dazu muss noch der Router konfiguriert werden, damit er Anfragen auf port 80 (und evtl. 443) auf die interne IP mit dem Webserver weiterleitet. Der interne Computer muss natürlich einen Webserver am laufen haben und die Firewall entsprechend konfiguriert (wenn denn eine da ist).

?? Regular Expressions: http://rubylearning.com/satishtalim/ruby_regular_expressions.html

Studieren Sie folgende String-Methoden (z.B. hier.)

  • [] (Substrings, Zugriff auf einzelne Buchstaben), z.B. hier.
  • chars
  • each_char
  • strip
  • split
  • die Array-Methode join (z.B. hier).
  • die Methode rand(n) (mit n eine Ganzzahl >= 1) (z.B. hier).

Programmieren Sie nun folgende Programme, die einen String einlesen und dann das Resultat ausgeben.

  1. Zwischen allen Buchstaben eines Strings wird ein Leerschlag eingefügt. Z.B. wird “abc efg” zu “a b c e f g”.
  2. Zwei zufällige Buchstaben werden vertauscht. Tipp: verwenden die spezielle Ruby-Syntax a,b=b,a um zwei Werte zu vertauschen.
  3. Die Eingabe besteht nur aus Ziffern 1, 2 und 3. Produzieren Sie dann als Ausgabe einen String, der angibt, wie viele dieser Ziffern vorkommen. Beispiel: “112223” liefert “213213” (2 Einsen, 3 Zwei, 1 Drei).
  4. Schreiben Sie ein Prmgraom, das in jdeem Wrot zewi innree Bcuhstaben vertauhcst, dh.. der esrte und letzte Buchetabsn müssen blnibee. Als Tiennzerchen zhiscwen Wöretrn knönen Sie eifnach Llerscheäge veewendrn(edor das ncoh bseser prognammierer). Als Beispeil eienr Augsabe dinet dseier Ttxe.

Lösungsvorschläge

Lösungsvorschläge

1. Leerzeichen einfügen:

str = "Ein Test-String  OK."
 
# Einzeiler
puts str.chars.join(" ")
 
# For loop
print str[0]
for i in 1...(str.size)
  print " #{str[i]}"
end
puts

2. Buchstaben vertauschen

str = "Buchstaben"
 
# Zwei zufällige, unterschiedliche Positionen
p1, p2 = rand(str.size), rand(str.size-1)
p2+=1 if p2>=p1
# Vertauschen
str[p1], str[p2] = str[p2], str[p1]
puts str

3. Ziffern zählen:

str = "112223"
puts str
# Position im String
p = 0
# aktuelle Ziffer
z = str[p]
# Anzahl Vorkommnisse
n = 0
 
# Resultat
res = ""
 
# String durchgehen
str.each_char{|c|
  if c==z # Immer noch gleich?
    n+=1  # Zähler erhöhen
  else
    res += "#{n}#{z}"  # Letze Ziffer ausgeben
    n = 1              # Neue Ziffer merken
    z = c
  end
}
res += "#{n}#{z}"    # Rest ausgeben
 
puts res

4. Wechstaben Verbuchseln

def switch(wort)
  return wort if (wort.size<4)
  p1, p2 = rand(wort.size-2)+1, rand(wort.size-3)+1
  p2+=1 if p2>=p1
  # Vertauschen
  res = String.new(wort)  # Wort kopieren, sonst Überraschungen möglich
  res[p1], res[p2] = res[p2], res[p1]
  return res
end
 
text = "Bis Juni 2016 wurden über 39,5 Millionen Artikel der Wikipedia in annähernd 300 Sprachen in Mehrautorenschaft von freiwilligen Autoren verfasst. Darüber hinaus werden die Artikel nach dem Prinzip des kollaborativen Schreibens fortwährend bearbeitet und diskutiert. Alle Inhalte der Wikipedia stehen unter freien Lizenzen."
 
# Einzeiler
puts text.split(" ").map{|w| switch(w)}.join(" ")
  • Ruby-Kurs (pdf-Version) Abschnitt 1.6 (Loops), Aufgabe 8 ist fakultativ.
  • In Java kann eine Farbe durch Angabe einer einzigen natürlichen Zahl ausgewählt werden, von denen die “unteren” drei Bytes als rgb-Werte aufgefasst werden. Die Funktion Math.random() liefert eine Fliesskommazahl $\in [0,1[$. Erklären Sie, wie und warum der folgende Einzeiler eine Zufallsfarbe wählt:
  new Color(Math.random()*0x100_0000);

Antwort

Antwort

Mögliche Farbwerte gehen von 0x00_0000 bis 0xff_ffff. Da die Zufallszahl immer kleiner als 1 ist, wird mit 0xff_ffff+1 = 0x100_0000 multipliziert.

  • Im Speicher stehen 3 Bytes mit den Werten 52, 50 und 49.
    1. Welche Zeichenkette (String) erhält man, wenn man diese 3 Bytes als ASCII-Code interpretiert?

Antwort

Antwort

“421”

  1. Welche natürliche Zahl erhält man, wenn man diese 3 Bytes Little-Endian als 24 bittige Binärzahl interpretiert?

Antwort

Antwort

Erstes Byte ist das niederwertigste (Einerstelle), also $52\cdot 256^0 + 50\cdot 256^1+49\cdot 256^2 = 3224116$, oder hexadezimal: 0x34 + 0x100*0x32 + 0x10000*0x31 = 0x313234

  1. Welche natürliche Zahl erhält man, wenn man diese 3 Bytes Big-Endian als 24 bittige Binärzahl interpretiert?

Antwort

Antwort

Erstes Bytes ist das höchstwertigste Byte. Also $52\cdot 256^2 + 50\cdot 256^1+49\cdot 256^0 = 3420721$, oder hexadezimal: 0x10000*0x34 + 0x100*0x32 + 0x31 = 0x343231

  1. Welche natürliche Zahl erhält man, wenn man den String (wie im Punkt 1) als Hexadezimalzahl interpretiert?

Antwort

Antwort

0x421 = $1 + 2\cdot 16 + 4 \cdot 256 = 1+32+1024 = 1057$

  • Grossbuchstaben haben den ASCII-Code 65 (A) bis 90 (Z). Kleinbuchstaben 97 (a) bis 122 (z). Von irgendeinem Buchstaben ist sein ASCII-Code in Binärdarstellung gegeben.
    1. Wie können Sie auf einen Blick entscheiden, ob es sich um einen Klein- oder Grossbuchstaben handelt?

Antwort

Antwort

Bei allen Grossbuchstaben ist das Bit 5 (d.h. das sechste von rechts) gleich Null (32er-Stelle ist Null). Diese Codes haben die Form 0b010y_yyyy. Bei Kleinbuchstaben ist das Bit 5 immer gleich Eins (32er-Stelle ist Eins). Diese Codes haben die Form 0x011y_yyyy.

  1. Wie kann man, in der Binärdarstellung der Codes, ganz einfach aus Gros- Kleinbuchstaben machen und umgekehrt?

Antwort

Antwort

Man ändert einfach das Bit Nr. 5.

  • Zählt man mehrere binäre Zahlen mit schriftlicher Addition zusammen, kann es einen Übertrag (“Behalte”) geben, der grösser ist als 2. Wie müsste man “Behalte 4” aufschreiben? (Als Beispiel: 4 mal die 7 zusammenzählen).

Antwort

Antwort

4 = 0b100. Also notiert man ein “Behalte 1” auf der übernächsten Position. Beispiel (nur die Einer-Stellen sind zusammengezählt):

1 1 1
+ 1 1 1
+ 1 1 1
+ 1 1 1
Behalte 1
—- —- —- —–
0
  • Wie bestimmt man möglichst effizient das Bit 16 (d.h. das siebzehnte Bit, man beginnt bei Bit 0 zu zählen) einer natürlichen Zahl, die als 8-stellige Hexadezimalzahl gegeben ist? Wie könnte man das mit Ruby tun?

Antwort

Antwort

Das Bit 16 entspricht der Einerstelle der fünften Hex-Ziffer. Ist diese gerade d.h. 0,2,4,6,8,a,c,e, dann ist das Bit 0, ansonsten 1. Bsp: 0xc84f_35a2. Fünfte Ziffer 0xf=15, ungerade, also Bit 1). In Ruby: 0xc84f_35a2[16]

  • Lernen Sie die Zweierpotenzen bis $2^{10}$ auswendig. Lernen Sie folgende Zweierpotenzen auf 10% genau auswendig: $2^{16}$, $2^{24}$, $2^{32}$, $2^{64}$.
  • Schreiben Sie die Zahl 78546939656932 in der Basis 36. Verwenden Sie dazu ruby.

Antwort

Antwort

78546939656932.to_s(36)

  • Ruby-Kurs (PDF-Version) bis und mit 1.5
  • Backup Ihrer lieben Daten
  • Ubuntu Installationsimage auf Stick mitbringen (oder andere Linux-Distro) (z.B. von http://www.ubuntu.com/ oder http://lubuntu.net/ für ältere Kisten).
  • Ggf. VirtualBox oder ähnliches installieren. https://www.virtualbox.org/
  • Ggf. schneller USB-Stick (>=16GB) oder externe HD/SDD (passender Anschluss) mitbringen.
  • Laptop mitbringen.
  • efinf/blc2016/hausaufgaben.txt
  • Last modified: 2017/01/09 13:32
  • by Ivo Blöchliger