[Write up] NaHamCon CTF 2023 - Android challenge
Tuần vừa rồi team mình đã tham dự Nahamcon CTF với tinh thần học hỏi là chính. Để đánh giá thì Nahamcon là một giải CTF hay, có bộ đề trải rộng nhiều mảng, số lượng đề lớn. Nếu muốn tranh giải thì một vài cá nhân khó mà chơi được, cần có một đội để chia nhau xử từng mảng mà mình giỏi nhất. Mỗi mảng thì đề đều nâng dần mức độ khó, nên bên cạnh tính thử thách thì bộ đề này có thể sử dụng để luyện tập cũng rất là ok luôn. Trong hôm thi mình chỉ tập trung làm các bài Android. Về đề Android thì mình đánh giá là hay, đặc biệt là 2 bài cuối. Tuy trong thời gian thi mình chỉ kịp giải 3/5 bài, bài cuối có hướng nhưng chưa kịp làm xong, bài số 4 thì hoàn toàn chịu =))))
Danh sách các thử thách về Android
Tên bài | Độ khó | Trạng thái |
---|---|---|
Fortune Teller | Dễ | ![]() |
JNInjaspeak | Dễ | ![]() |
Red Light Green Light | Trung bình | ![]() |
Where's Waldo | Trung bình | ![]() |
Nahamstagram | Trung bình | ![]() |
Fotune Teller
Giao diện của bài này rất đơn giản, chỉ có hai đối tượng cần để ý là: 1 EditText và 1 Button. Dù có nhập vào cái gì đi nữa thì ứng dụng cũng chỉ hiện lên một thông báo linh tinh.
Với một ứng dụng không có nhiều chức năng như này thì chúng ta sẽ tập trung luôn vào việc decompile và phân tích dữ liệu trong tệp tin apk. Thứ tự mình thường kiểm tra là:
- /asset
- /values/public.xml
- /values/strings.xml
- /lib
Ở trong tệp tin strings.xml có một giá trị đáng ngờ tên là correct_guess
Sau khi nhập input là you win this ctf
thì ứng dụng sẽ hiện ra flag.
Khi kiểm tra mã nguồn thì có thể nhận thấy tấm ảnh chứa flag đã được mã hoá từ trước, chỉ khi nhập đúng chuỗi ký tự thì ứng dụng mới giải mã tấm ảnh chứa flag.
JNInjaspeak
Giao diện của JNInjaspeak cũng tương tự Fotune Teller, chỉ có hai đối tượng cần để ý là: 1 EditText và 1 Button. Chỉ khác ở chỗ khi bấm vào nút thì ứng dụng sẽ chuyển các ký tự chúng ta nhập vào thành các ký tự khác như một mã hoá hoán vị.
Khi dịch ngược mã nguồn của ứng dụng, có thể thấy được ứng dụng đang sử dụng một thư viện riêng.
Để phân tích thư viện này thì cần decompile tệp tin apk bằng apktool. Sau khi decompile thì thư viện sẽ có trong thư mục asset hoặc thư mục lib. Trong trường hợp này thì thư viện jninjaspeak.so nằm trong thư mục lib.
Trong trường hợp không biết dịch ngược code C thì cứ strings và grep. Thao tác này cũng tương tự việc mở IDA lên dịch ngược và tìm các đoạn string mà thôi.
Red Light Green Light
Ở bài này chúng ta chỉ có một nút bấm duy nhất, nhưng khi bấm vào thì không có điều gì xảy ra ngoài một thông báo. Đọc thông báo này, có thể đoán được rằng chúng ta cần phải khống chế được logic của nút bấm để có thể lấy được flag.
Đúng như vậy, khi đọc mã nguồn dịch ngược qua Bytecode Viewer, ta thấy được ở đây chỉ kiểm tra dựa vào giá trị của biến red
. Nếu có thể thay đổi giá trị của biến này thành false thì ứng dụng sẽ giải mã thông tin cho chúng ta.
Và để làm được như vậy thì có thể patch app.
Sau khi decompile ra bằng apktool thì sẽ kiểm tra trong tệp tin MainActivity.smali
Biến red
đã được khai báo ở dòng 54.
Và được gán cho giá trị là true trong constructor. Như vậy để thay đổi giá trị của biến red
thành false thì chỉ cần đổi const/4 v0, 0x1
thành const/4 v0, 0x0
là được.
Quá trình dựng lại tệp tin apk mới thì tương tự như ở bài viết Tìm hiểu dạng CTF Reverse Android: dịch ngược và patch file APK. Tuy nhiên có một điểm cần lưu ý nếu sau khi ký rồi và cài đặt vẫn gặp lỗi này:
Thì có thể sửa bằng theo các bước sau:
- Tạo chữ ký bằng keytool.
- Căn chỉnh tệp apk bằng zipalign.
- Ký bằng apksigner (do ký bằng jarsigner có thể xuất hiện 1 số lỗi khác).
Sau khi patch thành công thì có thể lấy được flag chỉ bằng 1 click.
Trên đây là writeup cho 3 bài đầu trong mảng Android của Nahamcon CTF 2023. Riêng bài số 5 mình có ý tưởng làm ra rồi, nhưng bản thân mình thấy đó là một bài hay, ít khi xuất hiện trong các giải CTF nên mình sẽ dành riêng một bài viết để phân tích về Nahamstagram
All rights reserved