Archive for the ‘ Paper, Tutorials und Co. ’ Category

Code Injection und dynamische String Decryption

Bei der Analyse eines Programm sties ich heute Mittag auf eine String-Encryption der wildesten Art. In dem heutigen Post wird es um die Entschlüsselung dieser String-Encryption mit Mitteln der Code-Injection gehen.

Bei der String-Decryption wurde ein Offset der verschlüsselten Daten in EBX übergeben und im Gegenzug spucke die Funktion den entschlüsselten String in EAX wieder aus. Eine solche Entschlüsselung wurde in dieser Form schon oft gesehn und ist weiter nichts besonders. Folglich vermutete ich ein XOR decrypt in irgend einer Art. Daher staunte ich nicht schlecht, als ich mit einer unglaublich langen und mit mehreren Subfunktionen durchzogenen Methode stand. Eigentlich baut man die String-Decryption nach, aber in diesem Fall gab ich es nach 20 Minuten auf. Aus der Adresse (!) des Offsets wurden nach Bitshifting-Operationen Offsets in andere Speicherbereiche errechnet, die wiederrum mit in die Decryption einflossen. Diese Speicherbereiche wurden wiederrum erst zur Laufzeit berechnet etc etc. Das dumpen dieser ganzen Daten stellte sich als schwierig herraus, daher verfolgte ich einen anderen Ansatz: Code Injection!

StringDecryptDie Idee dahinter ist schnell erklärt: Anstatt dass man die String-Decrypt-Funktion rekonstruiert um sie im Programm zu verwenden, ruft man die Decrypt-Funktion direkt im zu crackenden Programm auf. Man schreibt also Shellcode der nichts anderes macht als einen String zu entschlüsseln. In diesem Fall ist der Umfang des Shellcodes beschränkt, denn wir müssen nur den gewünschten Offset in EBX laden, die Funktion aufrufen und das Resultat aus EAX auswerten. Uns werden dabei noch einige Steine in den Weg gelegt, aber über die steigen wir nach und nach drüber. Fangen wir erstmal damit an, wie der Shellcode überhaupt ins Programm gelangt und ausgeführt wird.

Weiterlesen

7 people like this post.

Cryptoanalyse - Known Plaintext

Es folgt der versprochene Beitrag zur Crypto-Analyse eines Usernet Account-Checkers. Dieser erlaubt es, den Account-Status per BB-Code in andere Seiten grafisch einzubinden. Klingt eigentlich nach einer netten Sache… Wenn dabei nur nicht die Account-Daten übergeben werden! Denn das PHP-Skript, welches das Bild erzeugt nimmt Usenet Username und Passwort als GET-Parameter entgegen. Um zu verhindern, dass die Accountdaten ausgelesen werden, wird der Accountname verschlüsselt.

usenetcheck

Ein solcher Include-Link sieht folgendermaßen aus:

usenext-check/image.php?a=vLjWqt+jvNGWm9S54bU==&p=dGVzdA==

Mit dem scharfen Kryptoanalyse-Blick stellt man fest, dass a (der Accountname) und p (das Passwort) Base64 encodiert sind. Während das Passwort einfach ASCII-Encoded ist, bekommt man beim Decoden von Parameter a zunächst Probleme. Denn es hängt ein Gleichheitszeichen zu viel hinten dran! Wenn man dieses überflüssige Zeichen entfernt lassen sich die Daten zwar encodieren, aber es handelt sich nicht um einen ASCII-String. Anscheinend ist der Accountname verschlüsselt.

Nun haben wir den großen Vorteil zu einem Accountnamen den Chiptertext generieren können. Also haben wir eine Known-Plaintext-Attack und kommen mit etwas Glück auf den Key. Füttern wir den Account-Checker mit ein paar Werten und schauen uns das Resultat an. Vielleicht stellen wir ja Gesetzmäsigkeiten fest…

Weiterlesen

9 people like this post.

Sicherheit in Onlinespielen - Wichtige Grundregeln

Egal ob Browsergame oder Multiplayer PvP, Onlinespiele sind in der heutigen Zeit sehr gefragt. Es macht einfach mehr Spass, gemeinsam mit Freunden zu Spielen, statt sich mit einer pseudoklugen KI an der Seite herrum zu schlagen. Der Trend geht klar Richtung Onlinespiele, was wiederrum auch Gamehacker anlockt. In dem heutigen Artikel werden Grundlagen besprochen, auf die man beim Programmieren achten sollte. Anschaulich wird das ganze durch Beispiele erklärt.

Das Spektrum von Hacks, über Bots und Exploits ist zu groß, als dass man es alles in einem Artikel abdecken könnte. Daher werden primär nur Echtzeit-Onlinespiele betrachtet. Diese Techniken lassen sich aber beliebig auf andere Multiplayer-Spiele übertragen. Und noch kurz zu den verwendeten Begriffen in diesem Artikel:

  • Server: Dabei handelt es sich um einen zentralen (!) Server, der das eigentliche Spiel hostet. Er nimmt Daten von anderen Spielern entgegen und verteilt die “Änderungen” im Spiel an alle verbundenen Clients. In machen Spielen wird der Server auch als “Host” bezeichnet, was im Prinzip nichts anderes bedeutet.
  • Client: Ein Spieler, der mit dem Server verbunden ist und aktiv Stati (Schießen, Laufen) an den Server sendet

Der wohl bedeutenste Grundsatz dürfte sein: Traue nie den vom Client empfangenden Daten. Der Client schickt, wie schon oben erwähnt, in regelmäsigen Abständen Daten wie seine eigene Position und seine Attribute an den Server. Wenn ein Gamehacker die Welt-Position des Clients verändert, wird diese auch zum Server gesendet. Wenn der Server diese Daten nun ungeprüft übernimmt, haben wir einen sog. Teleport-Hack. Solche Teleport-Hacks befanden sich u.a. in großen Onlinespielen wie Metin 2.

Während sich der entstehende Vorteil durch Teleportierungen noch in Grenzen hält, hört der Spass bei sog. Masskill-Hacks auf. Dabei sendet der Client die Nachricht “Ich habe XX Schaden am Gegner Y gemacht”. Der Server übernimmt dieses ungeprüft und tötet den Gegner Y. In Battlefield 3 ist dieser Hack inzwischen gefixxt, die Kollisionserkennung ist allerdings immernoch Clientseitig. So sind “Instant Kills” möglich, indem man einfach den Schaden, den eine Waffe verursacht, ins unendliche erhöht. Daher die Regel Nummer 2: Auf Plausibilität prüfen! Im Falle einer clientbasierten Kollisionserkennung kann man durch Wände schießen. Wenn der Server nun einmalig prüft, ob Spieler X den Spieler Y überhaupt treffen kann, wären solche Hacks schon verhindert. Warum das nicht gemacht wird? Weil solche Checks relativ viel Rechenleistung brauchen und einen Server mit 64 Spielern überfordern würde.

Weiterlesen

8 people like this post.

Stämme Bot - Timing ist alles

Heute geht es um präzise tickende Maschienen und ein Projekt, das nun doch ziemlich komplex geworden ist. Ein Stämme Bot!

Doch zunächst etwas in eigener Sache: Vielleicht bist Du hier, weil Du mehr oder weniger freiwillig von Keller-Elite auf diese Seite weitergeleitet wurdest. Hoschi111 war so nett, nach der Schließung von Keller-Elite die User hier her zu leiten. Ist eine große Ehre für mich und ich hoffe es gibt hier den ein oder anderen Artikel der Dich interessiert.

Ich weis nicht, ob Du schon Erfahrung im Browsergame “Die Stämme” gemacht hast. Wenn nein, hier eine kurze Einführung: Um ein anderes Dorf zu erobern (im Stämmejargon auch “adeln”) muss man zwischen 3 und 5 erfolgreiche Angriffe mit einem Adelsgeschlecht auf das Dorf führen. Jedes Adelsgeschlecht (kurz AG) senkt die Zustimmung der Bevölkerung um 20-35 Prozent. Nach und nach sind die Dorfbewohner gewillt zum Angreifer überzulaufen. Dies möchte der Verteidiger natürlich verhindern und schickt allerei Defensive Einheiten in den Kampf um das Dorf zu verteidigen. Manchmal ist die Übermacht aber so groß, dass die eigene Verteidigung nicht standhält. Und dann tritt Plan B in der Kraft: Das “raustimen”. Da die große Offensive vor den AGs angreifen muss, um das Dorf von jeglicher Verteidigung zu befreien, laufen verschiedene Angriffswellen auf ein Dorf. Zumeist sind das ein bis zwei große Offensiven und direkt dahinter die AGs. Die AGs greifen meist mit nur geringem “Begleitschutz” an, denn eigentlich ist das Dorf ja leer. Und meist werden alle verfügbaren Einheiten bei der großen Offensive gebraucht.

Der Clou ist nun das “Timen” dieser Angriffe. Man möchte dem Verteidiger möglichst wenig Chancen geben, zwischen den beiden Angriffswellen (Offensive und AGs) Unterstützung im Dorf zu plazieren. Also folgen die Angriffe im Optimalfall wenige Zehntelsekunden aufeinander. Da man 4 Angriffe für die AGs möglichst Zeitnahe aufeinander losschicken muss, wird die Sache spannend. Es gibt extra Tools im Internet zum üben des “Timens” dieser Angriffe. Doch in was in der Computer uns weit vorraus? Richtig, Timing!

Aus einem Tool, das lediglich Planngszwecke erfüllen sollte, ist so ein mehr oder weniger komplexer Bot geworden. Ein paar Bilder sagen wie immer mehr als Worte:

DSBot_1

Weiterlesen

8 people like this post.

Form Grabbing in Firefox - PoC

Form Grabbing in Firefox. Das ist nichts neues und es gibt zuhauf Beispiele mit dokumentierem Sourcecode. Warum also ein Artikel drüber verfassen? Ein guter Bekannter zeige mir ein Video von einem Form-Grabber in Firefox und fragte mich wie das geht. Ich hatte mich nie damit beschäftigt und nur ein paar Ansätze im Kopf, doch das interesse war geweckt. Wie schaffen es Bots, Daten aus Website-Formularen so gezielt auszulesen?

In dem folgenden Artikel wird ein Proof of Concept von einem Form-Grabber mit injecteter DLL erstellt. Das besondere im Vergleich zu den 100 anderen Proof of Concepts ist hierbei, dass die injectete DLL Managed ist und somit erst ein CLRHost für das Ausführen von .NET Code reingeladen werden muss. Das Konzept sollte aus den vorherigen Artikeln wie diesem und diesem bekannt sein.

Fangen wir mit etwas Theorie an: Es gibt zwei Wege Daten aus Webformularen auszulesen. Diese Formulare sind intern auch nur Textfelder, die man markieren und kopieren kann wie man es aus Windows gewohnt ist. Das heißt im Umkehrschluss auch, dass diese Felder ein Handle und eine Windows-Klasse besitzen müssen. Mit diesem Handle können wir von externen Programmen Firefox dazu auffordern, uns den Textinhalt dieses Handles zurückzugeben. Der große Nachteil ist, dass man sich erstmal zu diesem Handle “Vorzuhangeln” muss. Hier muss man über mehrere UI Elemente und Knoten mit Unterknoten laufen, bis man am gewünschten Ziel angekommen ist. Sehr elegant ist das nicht und für jede Seite müsste dieser Pfad eingeprogrammiert werden! Wer weiteres über diesen Ansatz lesen möchte, dem sei die WM_GETTEXT Message und dieser Stackoverflowpost ans Herz gelegt. Eleganter, und vor allem universal für jede Seite ist das Abfangen von der GET/POST Request bevor diese über SSL unkenntlich gemacht wird. Und genau dieser Ansatz ist verblüffend einfach und zielführend!

Die später geschriebene DLL hängt sich an die sog. PR_Write Funktion der nss3.dll von Firefox. Diese wird verwendet, um Streams jeder Art zu beschreiben. Sei es ein Filestream welcher auf die Festplatte schreibt, oder ein Netstream welcher an eine TCP Verbindung gerichtet ist. Wie unschwer zu erkennen ist, nimmt diese Funktion drei Parameter entgegen. Der erste ist das Stream-Handle, was nicht weiter besprochen wird. Das zweite Argument enthält einen Zeiger auf einen Buffer (Zwischenspeicher), in welchem sich die zu schreibenden Daten befinden. Das dritte Argument gibt schließlich an, wieviele Daten aus dem Zwischenspeicher in den Stream geschrieben werden sollen.

Setzt man mit OllyDBG einen Breakpoint an der PR_Write Funktion, so lassen sich alle drei Argumente schön im Stack anschauen. Das deutet daraufhin, dass es sich bei der PR_Write Funktion um eine cdecl-Calling-Convention handelt. Die später für uns wichtige Calling Convention gibt an, wie die Parameter der Funktion übergeben werden. Dabei gibt es viel Möglichkeiten: Parameter können sich in Registern befinden oder auch der Reihe nach auf den Stack geladen werden. Letzeres ist wohl hier der Fall.

PR_Write

 

Schön zu sehen sind die 3 Stackargumente in umgekehrter Reinfolge. Die Return-Adresse befinder sich ganz Oben auf dem Stack, danach folgt der Zeiger auf den Stream und der Zeiger auf den Buffer. Als drittes Argument kann man die Länge des Buffers, in diesem Fall 0×221 Bytes sehen. Links im Stack Window ist die Buffer-Adresse geöffnet. Hier sieht man klar die POST Request die gesendet wird, mit allen GET und POST Parametern. (GetParam=NotSoSecret, PostParam=VeryS3cret).

Weiterlesen

11 people like this post.

Stadt Land Fluss Multiplayer - Pwned

Hallo zusammen! Der Ausdruck “Pwned” findet in meinem Vokabular eigentlich keine Verwendung, doch hier ist er wirklich angebracht. Heute geht es um eine (noch) relativ unbekannte App “Stadt Land Fluss Multiplayer“, welche mit ca. 25000 Downloads nicht so bekannt wie Quizduell ist. Das Prinzip des Spiels ist einfach: Man hat 60 Sekunden Zeit, in den verschiedesten Kategorien Begriffe mit dem gleichen Anfangsbuchstaben einzutragen. Wer also die meisten Wörter weis und dabei auch noch ohne Schreibfehler tippt, schlägt den Gegner.

Screenshot_2014-07-13-18-23-33

Eine normale Modifikation könnte uns die Zeit zum Eintippen der Begriffe auf unendlich hochsetzen. Ein solcher Hack ist innerhalb von 3 Minuten geschrieben, denn die GameActivity bekommt als Parameter 60 ( = Sekunden) übergeben. Ein kleiner Smali-Patch schafft hier Abhilfe. Doch das ist kein Pwn, bei Begriffen die wir nicht wissen hilft uns auch keine längere Zeit zum überlegen. Ein anderer Ansatz muss her!

Diesen Ansatz finden wir in der API, die glücklicherweiße die Daten unverschlüsselt und per JSon überträgt. Zum Abrufen von Spieldaten senden wir folgende Request an den Server:

postData={"auth":{"password":"PASSWORDMD5Hashed","userId":"66XXX"},"clientInfo":{"appVersion":"1.0","bundleId":"de.lochmann.stadtlandfluss","os":"android"},"requests":{"getGameData":{"gameId":"1945415","userId":"X61XX","type":"getGameData"}}}

Die Antwort, welche zu Lang zum pasten ist, liefert uns diverse Strukturen mit Daten zum Spiel, dem Spieler, seiner Punktezahl und natürlich den bisher eingegeben Antworten. Ihr ahnt, worauf es hinausläuft? Daten aller Spiele grabben, eine riesige Datenbank aufbauen und pwnen! Das wäre ein Ansatz, doch bei bisher 1945415 gespielten Spielen wäre das komplette Grabben sinnlos. Zwar habe ich hier nun eine 2 GB Datenbank mit den ersten paar tausend Einträgen rumliegen, doch das filtern von richtigen Antworten macht auch nicht wirklich Spass. Man könnte daraus eine informative Statistik über Antworten und Punktezahlen erstellen, doch das nur als Randgedanke.

Weiterlesen

9 people like this post.

Hardware, COM-Ports und Python

Aus ist es mit .NET, Windows und grafischen Oberflächen! Easysurfer is Python-Begeistert und steuert Hardware an! Weg mit dem Klickibunti-Kram, gebt mir einen Lötkolben und ein paar Drähte! Nein, ganz so schlimm hat es mich nicht erwischt. Dennoch folgt jetzt ein Beitrag, der sich dieses mal etwas hardwarenäher abspielt.

Ich gebe zu dass ich von Elektrotechnik keine Ahnung habe. Vielleicht finde ich es gerade deshalb so toll einen Geldscheinprüfer in der Hand zu haben und ein Protokoll zu implementieren. Man schickt ein Befehl und der Prüfer fängt an zu Blinken, zu surren und schließlich einen Geldschein zu verschlucken. Toll!

Genug der Euphorie, es stellt sich die Frage: Woher hat er so ein Ding? Und wozu braucht er es überhaupt? Ein Freund und ich bauen mit minimalistischer Hardware ein Art Bitcoin-Transfer-Automat. Die Idee dahinter ist simple: Der Kunde wählt einen Betrag und eine Bitcoin-Adresse aus, der Automat frisst die Scheine und transferiert den entsprechenden Betrag in Bitcoin an die eingelese Adresse. Es wird zu gegebener Zeit einen vollen Artikel zu diesem Projekt geben, aber heute ist der Geldscheinprüfer dran.

Es handelt sich um einen Apex 7000 der Firma Pyramid Technologies. Die genauen Spezifikationen interessieren uns gerade wenig, wir wollen das Ding anschließen und Programmieren. Im Lieferumfang waren 2 Kabel dabei: Ein USB zu 6-Pin-Kabel mit welchem man die Firmware flashen und einstellen kann, sowie ein USB zu 18-Pin Kabel, welches noch zusätzlich mit Strom über ein 4 Pin-Kabel vom Netzteil versorgt wird. Wer sich jetzt unter meinem untechnischen gebrabbel nichts vorstellen kann hat hier noch ein frisch fotografiertes Bild:

Apex7000

Nachdem der PC aufgeschraubt, ein Stromkabel geklaut und die Treiber installiert sind kann es losgehen. Angesprochen wird das Teil über einen seriellen COM-Port. Das Gerät sendet keine Daten raus, sofern wir sie nicht anfordern (pollen). Daher schauen wir erstmal ein Blick in die PDF, in welcher das Transferprotokoll beschrieben ist: RS-232 Serial Interface Specifications.

Weiterlesen

8 people like this post.

tr4ceflow Crackme/Keygenme 1

In diesem Artikel geht es um das Crackme/Keygenme 01 von tr4ceflow. Der Crack selbst ist mit einem kleinen Patch getan, aber der Keygen ist anspruchsvoll. Ich selbst habe nicht viel Erfahrung mit Keygenning, zumindest nicht was native Algorithmen angeht. Daher werde ich den Algorithmus, den Code und den Prozess zum Keygen ziemlich ausführlich beschrieben.

Los gehts mit der ersten aufpoppenden Message-Box die es wegzupatchen gilt. Target in Olly laden, starten und nach dem Aufpoppen der Messagebox unterbrechen. Nun im Stacktrace soweit zurückgehen, dass man aus den “System”-DLLs wie Apphelp und USER32 in der eigentlichen Executable landet. In diesem Falle ist das der Stack:

Und die Instructions zu denen dieser RETURN führt:

Wir patchen nur den Call zur Messagebox und die folgende Instruction, nicht das Laden der Argumente auf den Stack. Der hier verwendete Compiler scheint die Argumente nicht direkt per PUSH auf den Stack zu laden, sondern vielmehr den Stackpointer manuell setzen und die Argumente direkt schreiben. Daher muss das SUB ESP,10 ebenfalls entfernt werden. MessageBoxA ruft diese Argumente ab und SUB ESP,10 fixxt den Stack wieder. Da keine Argumente abgerufen werden, muss der Stack auch nicht gefixxt werden.

Weiterlesen

6 people like this post.

Siedler 3 - Lobby Preview

Die letzen Tage habe ich wieder viel mit Siedler 3 verbracht. Allerdings nicht mit Spielen, sondern mit Reversing und Coding.

Durch einige Tricks habe ich es geschafft, einzelne UI Elemente zu “kontrollieren” und Aktionen mit ihnen durchzuführen, die eigentlich nur nach einem Mausklick auf das jeweilige Element erfolgen. Denn die “neue” Lobby wird über das LAN-Menu laufen, nur dass der Bildschrim komplett ersetzt wird. Um aber ein Spiel aus dem LAN-Modus zu starten, sind folgende Schritte notwendig:

  • Spieler klickt auf den Adapter in der ersten Listview (DirectPlay Adapter)
  • Spieler klickt in die Textbox und gibt die IP des Hosts ein
  • Spieler klickt auf “Suche Spiele” -> Spiele werden angezeigt
  • Spieler wählt ein Spiel aus der Lisview aus
  • Spieler klingt auf “Mitspielen”.

Diese 5 Schritte kann ich nun per Programmcode aufrufen, auch wenn es noch nicht immer klappt (Bei einem Fehlerdialog hängt sich das Programm auf, da dieser eigentlich nicht vom UIThread aufgerufen wird etc).

Das bedeutet, dass einer neuen Lobby nun nichts mehr im Wege steht. Oder doch? Die eigentliche UI für die Lobby muss ja noch geschrieben werden. Und dabei kann (wegen des alten GDI standarts, leider nicht mal GDI+) auch keine UI Library verwendet werden. Selber schreiben heißt die Devise! In den letzten Tagen habe ich daher einige Basis UI Klassen angefertigt (TextLabel, Button, ListView) um daraus eine Lobby zu konstruieren. Das Resultat:

Weiterlesen

9 people like this post.

Flappy Bird - Innereien und Kollisionserkennung

Ohai zusammen,

es geht zur Abwechselung mal wieder um Android RE! Die letzen Stunden habe ich damit verbracht mich durch diverse IDEs zu schlagen, ein Ubuntu System aufzusetzen, nur um dann schlussendlich doch alles von Hand zu machen. Aber auf diesem Wege lernt man so einiges, dass ich gerne mit euch Teilen möchte. ;)

Flappy2

Fangen wir mit dem Debugging von Android Applikationen/Spielen an: Wie aus den letzen Posts über Android bekannt ist, kann man per APKTool die App auseinander nehmen und sie im Anschluss wieder zusammensetzen. Ein Schalter, welcher dabei viel zu wenig Aufmerksamkeit bekommt ist der -d Switch. Dieser sorgt dafür, dass Debug Daten in die Smali-Dateien extrahiert und beim Builden (wieder mit dem -d Switch) so verlinkt werden, dass wir durch den Code steppen können (Im App Manifest debuggable=”true” setzen nicht vergessen!). Nun müssen wir “nur” noch ADB aktivieren, verbinden und DDMS (Dalvik Debug Montior) aufruften. Nun können wir mit einer IDE unserer Wahl den Debugger attachen und uns an Stacktraces, lokalen Variablen und Breakpoints erfreuen.

Flappy Bird, der neuste Hype auf Android und iOS Systemen, bringt einen nicht nur beim Reversen zur zur Verzweiflung. Durch Flügelschläge muss man in 8-Bit-Grafik einen Vogel durch einen Kurs fliegen und dabei jegliche Kollision vermeiden. Der Frustationsgrad, allerdings auch der Suchtfaktor, sind bei diesem Spiel enorm. Frustierend ist auch, dass APKTool Fehler beim Decoden mit Debugswitch auswirft, und wir somit auch wirkliches Debugging verzichten müssen. Und noch frustierender ist, dass mal wieder alle Typenbezeichner durch einzelne Buchstaben aus dem Alphabet ersetzt wurden. Aber einen “Vorteil” hat FlappyBird: Es setzt nicht auf nativen Grafik-Code, wie es andere Spiele tun (Code in Shared Libary = ELF Format auslagern). Das bedeutet: alles zeichnen und updaten geschieht von Java Code aus. Ausgelagerter Code wäre noch schwerer zu analysieren gewesen.

Weiterlesen

8 people like this post.