Category Archives: Java

Erkennen von Schwachstellen in verschlüsselten Daten

Dank einem entsprechenden Posting von SANS habe ich mir mal wieder ein paar Gedanken gemacht über die Thematik und den Einsatz von Entropy, also der Zeichendichte von einem String, einem Text oder einer gesamten Applikation.

Obwohl die Einsatzgebiete eigentlich recht umfassend sind, habe ich die Entropy eigentlich bisher nur zur Analyse von modifizierten Files unter Windows eingesetzt, wie in meinem Artikel über densityScout beschrieben. Doch eigentlich sind der Fantasie keine Grenzen gesetzt, da ich dank der Entropy eine einfache Anomaly-Detection auf jedem nur erdenklichen String durchführen kann, sei das nun ein Teil aus einem Text, ein Dateiname oder gar ein abgefragter DNS-Request.

Und so habe ich mir kurzerhand ein kleines Java-Tool genannt „entropyCalc“ geschrieben, womit ich genau die Problematik in dem SANS-Artikel angehen möchte: Ein verschlüsselter Text soll analysiert werden, ob er komplett verschlüsselt wurde, oder ob noch einzelne Textstellen unverschlüsselt erhalten sind:

A tool for dividing the input in X parts and calculating the entorpy of each. This can help analysing a file encrypted by a ransomware regarding its quality.

Call the prepared JAR passing the path of the file (path/to/file) and the number of parts (numb_of_parts) the file should be divided into. Optionally you can pass a max value for the entropy to display:

java -jar entorpyCalc.jar /path/to/file numb_of_parts [max_entorpy_val]

Zu finden gibts das ganze unter meinem GitHub-Account.

Wie die Beschreibung schon sagt, ist das Tool recht einfach gehalten: Ich kann ein File eingeben und die Anzahl an Parts bestimmen. Zusätzlich kann ich auch noch einen optionalen Filter setzen, damit mir nur Werte tiefer meiner gesetzten Marke angezeigt werden.

Wenn man damit nun das Test-File /res/test.bin mit initial 200 Parts analysiert, so interessiert mich vor allem mal die letzten 3 Zeilen mit der Zusammenfassung:

...
[039985 - 040188] 6.902040462088795
[040189 - 040392] 6.870033966927124
[040393 - 040596] 6.877924361409659
[040597 - 040800] 6.883538317427925
[040801 - 040943] 6.663231126927669

[Minimum] 4.425002256404638
[Maximum] 7.1385534526549055
[Average] 7.924522721343111

Da ich hier bereits grosse Abweichungen zwischen Minimum und Maximum sehe, weiss ich, dass da etwas noch in Echtform da sein muss. Also erhöhen wir einfach mal auf 1000 Parts und setzen 4.0 als die Obergrenze an Dichten für die angezeigten Parts:

[004161 - 004200] 2.885290338447572
[004201 - 004240] 0.9975846798245739
[004241 - 004280] 2.957351274437585
[004481 - 004520] 3.4607912955405005

[Minimum] 0.9975846798245739
[Maximum] 5.3219280948873635
[Average] 7.924522721343111

Und sofort ersichtlich wird, dass da garantiert noch etwas unverschlüsseltes drinstecken muss, denn eine Dichte von 0.99 ist sehr stark an einer normalen Sprache angelehnt. Weiter kann ich sehen, dass mein String irgendwo zwischen Zeichen 4161 und 4200 beginnen und zwischen Zeichen 4481 und 4520 enden muss, da hier auch noch eine tiefere Dichte erzielt wurde.

Was ich aktuell noch nicht bieten kann, ist eine Methodik zum Eingrenzen des genauen Strings, aber daran arbeite ich noch und vielleicht kommt mir ja die zündende Idee noch.

Memory für Eclipse: Out of Memory Exception

Für Performance-Messungen beim Abfüllen, Durchsuchen oder Löschen von Listen, Trees oder Maps habe ich ein kleines Java-Programm geschrieben, welches alle Aktionen misst und ausgibt. Eigentlich nichts grosses, doch bei den 10 Millionen Instanzen, welche ich für ein aussagekräftiges Resultat brauche, kommt meine Maschine schnell ans Limit und Reklamiert mit einem Runtime-Error in Form einer „Out of Memory Exception“. Das liegt daran, dass Eclipse einem Programm nur sehr begrenzt Memory zur Verfügung stellt (ich glaube gerade mal 256 MB) und dies bei 10 Millionen Instanzen nicht ganz ausreicht.

Also muss ich auf meinem Mac das Programm mit mehr Memory starten, und das geht ganz einfach und unkompliziert über Eclipse. Einfach unter Run > Run Configurations folgende Werte eintragen:

memory

Nun, nochmals ausführen und schon läuft alles durch. Das Programm werde ich samt Ergebnis vielleicht auch noch kurz veröffentlichen, mal schauen, was rauskommt.

Schiffe versenken in Java

Als Prüfungsvorbereitung kämpfe ich mich zur Zeit ein kleinwenig mit Java ab. Zum Glück noch nichts mit GUI, etc, einfach Java Basics, wie in den letzten zwei Büchern, die ich vorgestellt hatte. Im Zuge dieser Vorbereitung ist ein Programm entstanden, dass ich euch nicht vorenthalten möchte, vielleicht gibt es ja die eine oder andere Verbesserung oder Kritik, oder es hilft sonst jemandem auf seinem Weg.

Das Projekt besteht aus drei Klassen: Game, für die Hauptklasse, Schiffe, für die Schiffe und Feld, für die einzelnen Felder.
Die Schiffe-Klasse beinhaltet einen Namen und da Arrays immer so viel Vorplanung voraussetzen, eine Arraylist:

import java.util.ArrayList;

public class Schiffe {
	int name;
	ArrayList<Feld> position = new ArrayList<Feld>();
}

Auch die Feld-Klasse ist ganz schlicht, nur mit einem zusätzlichen Konstruktor:

public class Feld {
	int x;
	int y;
	int orientation;
	
	public Feld(int x, int y) {
		this.x = x;
		this.y = y;
	}
}

Interessant wird es in der Game-Klasse. Es gibt eine Methode positioning(), welche die Schiffe setzt. Darin werden auch gleich doppelt belegte Felder geprüft. Weiter gibt es eine Methode play(), welche für die Spieler 1 und 2 nacheinander die Methode shoot() aufruft, und darin gleich die Referenzen auf die Feld- und zum Schluss auch noch auf die Schiff-Objekte löscht. Ist ein Schiff versenkt, so wird die Methode win() aufgerufen, welche checkt, ob jemand gewonnen hat und bei bedarf, das Spiel unterbricht. Gar nicht so kompliziert oder? 😉

Read more

Das Leid von Java

Ja, ich bin nicht wirklich ein Fan von Java. Wieso kann ich auch nicht sagen, wahrscheinlich habe ich mich zu sehr an die Vorzüge von Visual Studio und dem damit verbundenen C# und .NET gewöhnt. Aber wenn man gezwungen ist, etwas zu lernen dank Ausbildung und Fachhochschule, so versucht man doch auch das beste daraus zu machen!

Und so bin ich an zwei wunderbare und sehr zu empfehlende Bücher geraten, welche ich gerne weiter empfehle!

Also Buch Nummer 1:
Ein Buch, dass sehr „alternativ“ geschrieben wurde, doch das meine ich keinesfalls abwertend. Das Buch ist nicht geschrieben wie sonstige Bücher sondern bringt sehr viel Farbe in das sonst so trockene Thema. Geeignet als Einstieg oder als Nachschlagewerk kann man dank Theorie und Kontrollaufgaben sein Wissen vertiefen und gleichzeitig festigen.

Buch Nummer 2:
Dieses Buch ist zwar relativ trocken geschrieben, doch erklärt sehr simple und verständlich auch noch so komplexe Themen mit gut ausgewählten Grafiken und Beispielaufgaben. Auch hier gibt es neben Theorie noch passende Kontrollaufgaben. Da das Buch aber nicht ganz so viel abdeckt, wie Nummer 1, ist es eher zum Einstieg, als zum Nachschlagen zu empfehlen.

Ich weiss, das Buch Nummer 1 etwas teuer ist, als Nummer 2, doch in meinen Augen ist das gut investiertes Geld und wenn man schon etwas Vorwissen im Programmieren hat, so ist Buch Nummer 2 die bessere Wahl!

Das Sieb des Eratosthenes

Wenn man den Titel so liest, werden sich wahrscheinlich die wenigstens etwas darunter vorstellen können…

Mir ging es genauso! Zuerst habe ich an Mathematik wie Satz des Pythagoras u.ä. gedacht, doch damit hat dies nun nicht viel zu tun, obwohl es um Mathematik, wenn auch einfache, geht!

Nun was ist dieses Sieb nun:

Das Sieb des Eratosthenes beschreibt ein Vorgang um aus einer Zahlenkette alle Primzahlen herauszulesen.

Eine Primzahl ist eine natürliche Zahl mit genau zwei natürlichen Zahlen als Teiler, nämlich der Zahl 1 und sich selbst

sponsored by Wikipedia

Eratosthenes macht sich dabei das Wissen zunutze, dass jede Nicht-Primzahl ein Vielfaches einer Primzahl ist. So wird jede zahl genommen und mit allen x-Reihen (2er-Reihe, 3er-Reihe, …, 1234er-Reihe) verglichen.

Gibt eine Zahl dann ein Positives Feedback, sprich sie ist ein Vielfaches einer andern, ist es keine Primzahl mehr und kann ausgeschlossen werden.

So kann man, wenn man genügend Rechenleistung hat, Primzahlen mit mehreren Millionen Stellen generieren lassen.

Der Code zum ganzen, habe ich in Java geschrieben. Er ist sicherlicht nicht gerade der kürzeste und beste, doch ich hoffe ihr verzeiht mir, wenn ich euch sage, dass ich gerade eben erst angefangen habe Java zu programmieren.

Ach ja: Programmiert wurde das ganze in Eclips unter Ubuntu 8.04 🙂

  • Lösungsbeispiel – TXT
  • Lösungsbeispiel – Java
« Older Entries