Guess – Reversing
Task
I was rummaging around some old files and found this badly made app (not mine by the way). Do you think you can uncover any hidden information hiding in when running it? You can download it here (guess.apk).
Solution
We get a guess.apk
file:
szczygielka@hacks$ file guess.apk
guess.apk: Android package (APK), with APK Signing Block
We can decompile it using this online tool. Within the directory sources/com/example/guess
we can locate a MainActivity.java
file. Inside this file, there is a class named flag
which contains a function named end
:
public static String end() {
return whatTheFunction("cmpkdjNjYzE6MzUuU1R8aHY0dHR6YGd2b2R1MnBvfi46MTI0M3M6amcz");
}
The end
function calls another function called whatTheFunction
, which code is as follows:
private static String whatTheFunction(String evilString) {
String fornameN = null;
if (Build.VERSION.SDK_INT >= 26) {
fornameN = new String(Base64.getDecoder().decode(evilString));
}
StringBuilder recursiveCharArray = new StringBuilder();
String undecryptedencryptedString = "SGF2ZSB5b3UgZXZlciB1c2VkIEZyaWRhPw==";
char[] finalrray = undecryptedencryptedString.toCharArray();
int kentucky = 0;
for (int xortrad = finalrray.length - 1; kentucky < xortrad; xortrad--) {
char glaf = finalrray[kentucky];
finalrray[kentucky] = finalrray[xortrad];
finalrray[xortrad] = glaf;
kentucky++;
}
for (int everyOther = 0; everyOther < fornameN.length(); everyOther++) {
recursiveCharArray.append((char) (fornameN.charAt(everyOther) - 1));
}
for (char c : finalrray) {
if (Build.VERSION.SDK_INT >= 26) {
undecryptedencryptedString = new String(Base64.getEncoder().encode("SGF2ZSB5b3UgZXZlciB1c2VkIEZyaWRhPw==".getBytes())) + c;
}
}
return "SGF2ZSB5b3UgZXZlciB1c2VkIEZyaWRhPw==" + recursiveCharArray + undecryptedencryptedString;
}
BecausewhatTheFunction
manipulates a Base64 strings, I assumed that this function may store the flag. So I decided to check how this function works. To compile Java code I used this website.
After a few modifications, we can call the end
function and whatTheFunction
function:
import java.util.Base64;
class Flag {
public static String end() {
return whatTheFunction("cmpkdjNjYzE6MzUuU1R8aHY0dHR6YGd2b2R1MnBvfi46MTI0M3M6amcz");
}
private static String whatTheFunction(String evilString) {
String fornameN = null;
fornameN = new String(Base64.getDecoder().decode(evilString));
StringBuilder recursiveCharArray = new StringBuilder();
String undecryptedencryptedString = "SGF2ZSB5b3UgZXZlciB1c2VkIEZyaWRhPw==";
char[] finalrray = undecryptedencryptedString.toCharArray();
int kentucky = 0;
for (int xortrad = finalrray.length - 1; kentucky < xortrad; xortrad--) {
char glaf = finalrray[kentucky];
finalrray[kentucky] = finalrray[xortrad];
finalrray[xortrad] = glaf;
kentucky++;
}
for (int everyOther = 0; everyOther < fornameN.length(); everyOther++) {
recursiveCharArray.append((char) (fornameN.charAt(everyOther) - 1));
}
for (char c : finalrray) {
undecryptedencryptedString = new String(Base64.getEncoder().encode("SGF2ZSB5b3UgZXZlciB1c2VkIEZyaWRhPw==".getBytes())) + c;
}
return "SGF2ZSB5b3UgZXZlciB1c2VkIEZyaWRhPw==" + recursiveCharArray + undecryptedencryptedString;
}
public static void main(String[] args){
System.out.println(end());
}
}

As expected, after executing the function we get a flag in the output string:
SGF2ZSB5b3UgZXZlciB1c2VkIEZyaWRhPw==qicu2bb0924-RS{gu3ssy_funct1on}-90132r9if2U0dGMlpTQjViM1VnWlhabGNpQjFjMlZrSUVaeWFXUmhQdz09S
As expected, there is a flag in this string.
Flag:
Guess: RS{gu3ssy_funct1on}
Last updated