This set had two Android reversing challenges. Both of them became much easier once I stopped staring at the default UI and followed the data that the APK already exposed.
M1n10n'5_53cr37#
First pass#
I started by opening minions.apk in jadx-gui and checking MainActivity, which is usually the first useful place in beginner Android reversing.
In this case it was mostly noise. Nothing there explained where the flag was hidden.
The first real clue came from the hint:
Any interesting source files?
That pushed me toward text search instead of static browsing. Searching for interesting turned up this string:
| |
So the next question became simple: where is Banana Value stored?
Pivot#
A second text search for Banana found the string resource:
| |
That blob looked like Base32 immediately. Decoding it gave the flag directly:
| |
Takeaway#
The only thing that mattered here was not trusting the activity layout as the whole challenge. The flag was never hidden behind complex code. It was just sitting in resources with a hint pointing at it.
Pico Bank#
First clue#
For pico-bank.apk, I again started in MainActivity, and this time the transaction list stood out right away:
| |
Those amounts were clearly not normal balances. They looked like binary.
Converting the values to ASCII recovered the first half of the flag:
| |
That established the pattern, but the flag was incomplete, so the rest had to be somewhere else in the app.
Second clue#
The challenge hint mentioned the OTP flow, so I searched for OTP in the decompiled sources and resources.
That led to:
| |
and to the verifyOtp logic:
| |
The important detail here was that the app still POSTed the OTP to the backend, and the backend response included the missing flag chunk. At that point the local OTP value was all I needed.
Getting the second half#
I sent the discovered OTP to the endpoint directly:
| |
The server responded with:
| |
Combining both parts produced the full flag:
| |
Final takeaway#
Both APKs rewarded the same habit:
- search the app resources instead of only reading the main activity
- treat weird constants as data first, not as UI decoration
- follow the client/server boundary when the app hints at network validation
Once those pivots were clear, neither challenge needed anything more complicated than text search, decoding, and one short request script.