Archive for Jul. 2014

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.

Apex = Defeated?

Anderthalb Monate ist es her, seid der erste Post über Apex entstanden ist. Nun bin ich an dem Punkt angelangt, Apex als besiegt zu bezeichnen. Zwar weis ich noch lange nicht, wie all die unzähligen Apex Module arbeiten, aber es reicht für uns einen Hack zu schreiben ohne das Apex (frei nach Archimedes) unsere Kreise stört , Mir ist klar dass dieser Post vielleicht von anderen Kopiert wird und als Vorlage für andere Hacks benutzt wird, daher werde ich keinen kompletten Source posten.

Im letzten Post wurde erwähnt dass Apex uns nach dem Hook von End2DOptimized und RenderString Kicks verteilt. Auch sollte im Hinterkopf behalten werden, dass Apex uns nicht selbst kickt, sondern nur Daten an den zentralen Server weiterleitet. Des weiteren sollten wir uns in das Gedächnis rufen, dass die Detour-Library die ersten 6 Bytes einer Funktion mit einem JMP ersetzt. Das alles deutet darauf hin, dass Apex irgendwie den Funktionsanfang prüft, ob dort Hooks gesetzt sind oder nicht. Prompt wurde CheatEngine gezückt und der Debugger attached, welcher in auf Lesezugriffe am Anfang der gehookten End2DOptimized Funktion achtet. Das selbe wäre auch mit OllyDbg möglich gewesen, aber CheatEngine ist in diesem Fall bequemer zu bedienen.

ApexHashing

Mit allein diesem Resultat fangen wir wenig an. Wichtig ist zu wissen, dass generell 0x7XXXXXXX Adressen in den Kernelspace zeigen. Mit dem Debugger finden wir, dass 0x760575B2 in der Funktion IsBadReadPointer liegt und diese wohl unseren Funktionsanfang prüft. Der Call dazu erfolgt allerdings auf dem 0x0CCXXXXX Adressbereich. Wir wissen ja inzwischen, das Apex zwei große Module in den Speicher mapped, allerdings ist keines davon annährend in diesem Bereich. Ein Glück, dass VirtualAlloc gehooked ist und wir somit die dynamischen Speicherreservierungen mitbekommen. Darin finden wir:

14:08:20 Virtual Alloc! Size: 7d90, Addr: 0xcce0000, allocType: 1000, flProtect: 40

Weiterlesen

17 people like this post.