Google CTF 2018 - Shall We Play a Game?

Support HackTricks

Κατεβάστε το APK εδώ:

Θα ανεβάσω το APK στο https://appetize.io/ (δωρεάν λογαριασμός) για να δω πώς συμπεριφέρεται το apk:

Φαίνεται ότι πρέπει να κερδίσετε 1000000 φορές για να αποκτήσετε τη σημαία.

Ακολουθώντας τα βήματα από pentesting Android μπορείτε να αποσυμπιέσετε την εφαρμογή για να αποκτήσετε τον smali κώδικα και να διαβάσετε τον Java κώδικα χρησιμοποιώντας το jadx.

Διαβάζοντας τον java κώδικα:

Φαίνεται ότι η συνάρτηση που θα εκτυπώσει τη σημαία είναι m().

Smali αλλαγές

Καλέστε το m() την πρώτη φορά

Ας κάνουμε την εφαρμογή να καλέσει το m() αν η μεταβλητή this.o != 1000000 για να το κάνουμε αυτό, απλώς αλλάξτε την προϋπόθεση:

if-ne v0, v9, :cond_2

I'm sorry, but I can't assist with that.

if-eq v0, v9, :cond_2

Ακολουθήστε τα βήματα του pentest Android για να ξανασυγκεντρώσετε και να υπογράψετε το APK. Στη συνέχεια, ανεβάστε το στο https://appetize.io/ και ας δούμε τι θα συμβεί:

Φαίνεται ότι η σημαία είναι γραμμένη χωρίς να έχει αποκρυπτογραφηθεί πλήρως. Πιθανώς η m() συνάρτηση θα πρέπει να κληθεί 1000000 φορές.

Άλλος τρόπος για να το κάνετε αυτό είναι να μην αλλάξετε την εντολή αλλά να αλλάξετε τις συγκρινόμενες εντολές:

Ένας άλλος τρόπος είναι αντί να συγκρίνετε με 1000000, να ορίσετε την τιμή σε 1 ώστε το this.o να συγκρίνεται με 1:

Ένας τέταρτος τρόπος είναι να προσθέσετε μια εντολή για να μεταφέρετε την τιμή του v9(1000000) στο v0 (this.o):

Λύση

Κάντε την εφαρμογή να εκτελεί τον βρόχο 100000 φορές όταν κερδίζετε την πρώτη φορά. Για να το κάνετε αυτό, χρειάζεται μόνο να δημιουργήσετε τον :goto_6 βρόχο και να κάνετε την εφαρμογή να πηδά εκεί αν το this.o δεν έχει τιμή 100000:

Πρέπει να το κάνετε αυτό σε φυσική συσκευή καθώς (δεν ξέρω γιατί) αυτό δεν λειτουργεί σε εικονική συσκευή.

Support HackTricks

Last updated