看到題目,知道這題和 APK 有關,提示告訴我們可以用 unzip
。
hint 1:Did you know you can unzip
APK files?
hint 2:Now you have the whole host of shell tools for searching these files.
首先,我們下載了題目給的 APK 檔案,然後用 unzip
指令解壓縮該 APK 檔案,解壓縮後發現了許多其他的檔案。
$ ls -l
-rw-rw-r-- 1 user user 4136367 Feb 7 17:56 mobpsycho.apk
$ unzip mobpsycho.apk
Archive: mobpsycho.apk
creating: res/
creating: res/anim/
inflating: res/anim/abc_fade_in.xml
inflating: res/anim/abc_fade_out.xml
inflating: res/anim/abc_grow_fade_in_from_bottom.xml
inflating: res/anim/abc_popup_enter.xml
inflating: res/anim/abc_popup_exit.xml
inflating: res/anim/abc_shrink_fade_out_from_bottom.xml
inflating: res/anim/abc_slide_in_bottom.xml
inflating: res/anim/abc_slide_in_top.xml
inflating: res/anim/abc_slide_out_bottom.xml
inflating: res/anim/abc_slide_out_top.xml
inflating: res/anim/abc_tooltip_enter.xml
inflating: res/anim/abc_tooltip_exit.xml
inflating: res/anim/btn_checkbox_to_checked_box_inner_merged_animation.xml
inflating: res/anim/btn_checkbox_to_checked_box_outer_merged_animation.xml
inflating: res/anim/btn_checkbox_to_checked_icon_null_animation.xml
inflating: res/anim/btn_checkbox_to_unchecked_box_inner_merged_animation.xml
inflating: res/anim/btn_checkbox_to_unchecked_check_path_merged_animation.xml
inflating: res/anim/btn_checkbox_to_unchecked_icon_null_animation.xml
inflating: res/anim/btn_radio_to_off_mtrl_dot_group_animation.xml
inflating: res/anim/btn_radio_to_off_mtrl_ring_outer_animation.xml
inflating: res/anim/btn_radio_to_off_mtrl_ring_outer_path_animation.xml
.............
為了尋找 flag,我們嘗試使用 grep -R 'pico'
指令來搜索是否有任何檔案的內文中隱藏了 flag。然而,並沒有找到相關的內容。接著,我們轉向檔案名的方向進行思考,使用 ls -R | grep 'flag'
指令尋找是否有名為 flag.txt
的檔案,最終成功找到這個檔案。
$ grep -R 'pico'
$ ls -R | grep 'flag'
flag.txt
找到 flag.txt
後,使用 find
找 flag.txt
的絕對路徑,然後使用 cat
讀取其內容,發現了一串看起來是 16 進位的字串。
$ find | grep 'flag'
./res/color/flag.txt
$ cat ./res/color/flag.txt
7069636f4354467b6178386d433052553676655f4e5838356c346178386d436c5f61336562356163327d
接著,我們將這個 16 進位字串轉換為 ASCII 字符,最終得到了 flag。
$ echo '7069636f4354467b6178386d433052553676655f4e5838356c346178386d436c5f61336562356163327d' | xxd -r -p
picoCTF{ax8mC0RU6ve_NX85l4ax8mCl_a3eb5ac2}
補充:
這裡需要補充的是,我有嘗試使用 apktool
來 decompile 這個 APK 檔案,但發現找不到 flag.txt
這個檔案。這可能是因為 apktool
在 decompile 過程中,將一些人類看不懂的 bytecode 轉換成了人類可讀的 source code,因此沒有找到 flag.txt
。但是unzip
只是單純地將 APK 檔案中的所有內容解壓縮成原始檔案,所以我們可以看到所有的文件,包括 flag.txt
。
$ apktool d mobpsycho.apk
I: Using Apktool 2.3.4-dirty on mobpsycho.apk
I: Loading resource table...
I: Decoding AndroidManifest.xml with resources...
I:Loading resource table from file: /home/user/.local/share/apktool/framework/1.apk
I: Regular manifest package...
I: Decoding file-resources...
I: Decoding values */* XMLS...
I:Baksmaling classes.dex...
I:Baksmaling classes2.dex...
I: Baksmaling classes3.dex...
I: Copying assets and libs...
I: Copying unknown files...
I: Copying original files...
$ ls
mobpsycho mobpsycho.apk
$ cd mobpsycho/
$ ls -R | grep 'flag'
小結:
了解到 unzip
和 decompile
的差異:unzip
是將 APK 檔案中的所有內容解壓縮成原始檔案,而 decompile
則是將 bytecode 轉換為人類可讀的 source code。在這種情況下,unzip
更適合我們的需求,因為它能夠直接解壓縮出我們需要的 flag.txt
檔案。