Tags: java apk reverse 

Rating:

# __Sharif CTF 8__
## _Barnamak_

## Information
**Category:** | **Points:** | **Writeup Author**
--- | --- | ---
Reverse | 200 | merrychap

**Description:**

> Run the application and capture the flag!

## Solution
### Decompiling
We are given with apk file. First of all, we have to decompile it. I used [jadx](https://github.com/skylot/jadx) for this, but you can use whatever tool you want. Okay, let's break into the code!



### Code reversing
As we can see, this apk is some challenge service where we have to pass 2 checks (as said in the ```Resourses/res/values/strings.xml```).

There are many different classes: network availability checker, some views and fragments (it's a kind of subview), SMS sender, and others.

The interesting class here is ```ChallengeFragmentOnClickListener```. It tells us what is going on when we click on Challenge button.

---
[**CODE OF ```ChallengeFragmentOnClickListener```**](./ChallengeFragmentOnClickListener.java)

---

### Checks
```ChallengeFragmentOnClickListener``` class has ```ChallengeFragment``` field, about which we will tell later. In the onClick function happen the next checks:

```java
private ChallengeFragment fragment;

[...]

if (this.fragment.b()) {
this.fragment.a();
return;
}
```

Let's explore ```ChallengeFragment``` class for understanding ```a``` and ```b``` functions:

---

[**CODE OF ```ChallengeFragment```**](./ChallengeFragmentOnClickListener.java)

---

First of all, let's start with ```b``` function. It checks the location of a device. So, it gives us the knowledge of the correct location.

```java
location.getLatitude() == 45
location.getLongitude() == -93
```

The next function is ```a```. A little bit more complex, but still readable. As we know, if ```b``` check is True, then ```a``` happens.

```java
if (c.a() || c.b() || c.c()) {
```

The code of ```c``` class is placed below:

```java
public class c {
public static boolean a() {
for (String file : System.getenv("PATH").split(":")) {
if (new File(file, "su").exists()) {
return true;
}
}
return false;
}

public static boolean b() {
String s = Build.TAGS;
if (s == null || !s.contains("test-keys")) {
return false;
}
return true;
}

public static boolean c() {
for (String file : new String[]{"/system/app/Superuser.apk", "/system/xbin/daemonsu", "/system/etc/init.d/99SuperSUDaemon", "/system/bin/.ext/.su", "/system/etc/.has_su_daemon", "/system/etc/.installed_su_daemon", "/dev/com.koushikdutta.superuser.daemon/"}) {
if (new File(file).exists()) {
return true;
}
}
return false;
}
}
```

Functions of this class check if we can get root privilege on a device. So, if we can, then happens the next:

```java
String Res = ChallengeFragment.iia(new int[]{162, 136, 133, 131, 68, 141, 119, 68, 169, 160, 49, 68, 171, TransportMediator.KEYCODE_MEDIA_RECORD, 68, 168, 139, 138, 131, 112, 141, 113, 128, 129}, String.valueOf((int) Math.round(ChallengeFragment.this.location.getLatitude())));

Toast.makeText(ChallengeFragment.this.getActivity().getBaseContext(), Res, 0).show();
```

It's obviuos that ```iia``` function is some kind of decoding. So, if we execute this, then we will get the next message ```Flag is MD5 O Longtiude```. As we know, ```location.getLongitude() == -93```, so we have to just get md5 hash of "-93". Alright, that's all folks.

> SharifCTF{87a20a335768a82441478f655afd95fe}



Original writeup (https://github.com/VoidHack/write-ups/tree/master/SharifCTF%208/reverse/barnamak).