Skip to content

feat(mobile): add Reverse Engineering lesson and challenges to the Android app - #1106

Open
SeanDuggan wants to merge 19 commits into
OWASP:devfrom
SeanDuggan:mobile-split/10-reverse-engineering
Open

SeanDuggan wants to merge 19 commits into
OWASP:devfrom
SeanDuggan:mobile-split/10-reverse-engineering

Conversation

@SeanDuggan

Copy link
Copy Markdown
Member

Summary

Adds the Reverse Engineering (M7) module to the Mobile Shepherd app, the first lesson-plus-challenge pair after the app shell.

  • Lesson: students decompile the APK and find a static key in KeyProvider (intentionally discoverable).
  • Challenge 1: the key is held as a Base64-encoded constant in ReverseEngineering1Model and must be decoded after decompiling.
  • Navigation, module info dialog, key hashes and Completed-group handling are wired up for both.
  • Updates the challenge page text/JSP, the lesson page, the cheat sheet solution, and adds a shared mobileBlurb.appLink string.

Scope

Android app plus its challenge/lesson content only. No platform changes.

Notes

  • Depends on the app shell PR (feat(mobile): android app shell #1068); until it merges, this PR also shows the shell's commits.
  • Reverse Engineering modules are client-verified by design: /mobileFlagSubmit returns 404 for them and the app falls back to a local SHA-256 compare, so no core.results row is written.
  • mobileBlurb.appLink is also added by the Client-Side Injection, Insecure Data Storage and Poor Authentication PRs, so expect a trivial one-line conflict on rebase.

Testing

  • Unit tests: ReverseEngineeringLessonTest (6), ReverseEngineeringChallenge1Test (5), ModuleAvailabilityTest (3).
  • Emulator, signed in against a local HTTPS server: wrong and correct key for the lesson and for challenge 1; lesson moves to Completed.

SeanDuggan and others added 10 commits October 26, 2026 19:09
Adds the Gradle project, manifest, resources, launch/login/main activities,
navigation, preferences, authentication, key validation and progress
tracking utilities, and the home, progress, scoreboard and ADB reference
screens. Lesson and challenge screens referenced by the navigation graph are
added in the following PRs, so those destinations are not usable until then.

Part of the split of OWASP#894 (mobile app).
Disable cleartext traffic app-wide via a network security config and reject non-https server URLs at login, registration and key validation. Debug builds additionally trust user-installed CAs for local development.
The shell now builds with an empty KeyValidator.Module enum and empty
nav, menu and module-info registries. Each lesson/challenge category PR
registers its own entries. Removes the myapp://open deep link and the
KeyValidator unit test, which return with the first category.
Removes lesson/challenge strings and the Insufficient Cryptography ADB
reference card. These return with their own category PRs.
The app asks /mobileModuleStatus which modules the signed-in student can
open and greys out the rest in the navigation drawer and progress list,
with the server's reason shown when tapped. This mirrors the platform's
open floor / CTF rules: module closed, event not running, module blocked.

Advisory only: the server re-checks every module start and key request.
It fails open, so signed-out or offline use and failed requests grey out
nothing. Status refreshes on resume, drawer open, sign in and sign out.
…JDK path

Changing server_preference while signed in kept the old server's session
cookie, so it would be sent to the new server. Log out when the server
actually changes.

Remove org.gradle.java.home, which pinned a Windows Android Studio path and
overrode JAVA_HOME on other machines.
Replace the individually listed local planning docs with a single *.md rule.
Remove CHALLENGE_SOLUTIONS.txt and missing_challenges.txt, which refer to
no files in the repository.
@SeanDuggan SeanDuggan added this to the 4.0.0 milestone Nov 1, 2026
@SeanDuggan
SeanDuggan requested a review from ismisepaul November 1, 2026 23:25
@SeanDuggan SeanDuggan self-assigned this Nov 1, 2026
SeanDuggan and others added 5 commits November 2, 2026 21:09
The logcat grep example rendered a literal "search_term" on the ADB Commands screen.
The Reverse Engineering rows still held DrumaDrumaDrumBoomBoom and
christopherjenkins, which the rewritten app never shows. The app validates the
two offline keys by SHA-256, so set moduleResult to those keys and keep
hardcodedKey=1 so the web comparison accepts what the app displays.
The Android app lives in mobile/, not mobile/MobileShepherd/.
Insecure Communication is deferred to 4.0.1. Remove its key hash
entries, ProGuard rules and the cleartext-traffic comment.
Drop the About dialog button that opened owasp.org and the unused hidden Top 10 FAB with its string. Lessons now name the relevant risk as plain text.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

Status: Backlog

Development

Successfully merging this pull request may close these issues.

2 participants