chạy lệnh context để kiểm tra chương trình

[Pentest] Hướng dẫn debug code c/c++ trên Android

January 22, 2019 | vietsunshine

Dưới đây là bài viết của team Pentest VietSunshine sẽ hướng dẫn bạn debug code c/c++ cho android app với mục đích để tìm hiểu cơ chế hoạt động và phát hiện các lỗ hổng bảo mật của ứng dụng.

Bước 1: Tạo ứng dụng mẫu để làm lab

Tạo một project support c++

Tạo một project support c++

Sau khi tạo project sẽ có cấu trúc như sau:

cấu trúc của project

File code MainActivity:

File code native-lib.cpp

Kết quả sau khi chạy ứng dụng

Kết quả sau khi chạy ứng dụng

Bước 2: Reverse ứng dụng

Sử dụng apktool để decode file apk build được của ứng dụng ở bước trên, chúng ta sẽ thu được các file và thư mục chứa source code như sau:

drwxrwxr-x  7 phi phi   4096 Th12 18 15:16 .
drwxrwxr-x  3 phi phi   4096 Th12 18 15:16 ..
-rw-rw-r–  1 phi phi   2324 Th12 18 15:16 AndroidManifest.xml
-rw-rw-r–  1 phi phi   1677 Th12 18 15:16 apktool.yml
drwxrwxr-x  3 phi phi   4096 Th12 18 15:16 lib
drwxrwxr-x  3 phi phi   4096 Th12 18 15:16 original
drwxrwxr-x 23 phi phi   4096 Th12 18 15:16 res
-rw-rw-r–  1 phi phi 230916 Th12 18 15:16 resources.arsc
drwxrwxr-x  4 phi phi   4096 Th12 18 15:16 smali
drwxrwxr-x  5 phi phi   4096 Th12 18 15:16 smali_classes2

Trong bài lab này chúng ta cần thực hành debug với một lib viết bằng C++ của chương trình lib (native-lib.cpp). Lib này thu được sau khi decode file apk và nằm trong thư mục lib/x86/

ls -la lib/x86/
-rw-rw-r– 1 phi phi 206524 Th12 18 15:16 lib/x86/libnative-lib.so

Copy thư viện

Copy thư viện từ máy ảo genymotion đến máy host. Trong quá trình debug sẽ cần một số thư viện này, do đó chúng ta sẽ copy hết thư viện của máy ảo về máy host để debug cho dễ.

mkdir lib
cd lib
adb pull /system/lib 2> /dev/null

Chạy ứng dụng:

chạy ứng dụng

Lấy process id của ứng dụng để attach vào gdb.

phi@440G3:~/genymotion$ adb shell ps | grep application6
u0_a67    1679  127   1014784 65936 00000000 f7537795 S com.example.phi.myapplication6

Attach vào pwndbg

Chạy lệnh bên dưới trên genymotion để attach process id của ứng dụng vào gdbserver:

phi@440G3:~/genymotion$ adb shell
root@vbox86p:/ # gdbserver :1234 –attach 1679
Attached; pid = 1679
Listening on port 1234

Chạy lệnh bên dưới tại máy host để load file libnative-lib.so vào pwndbg:

phi@440G3:~/lab-android/MyApplication6/reverse/apktool/lib/x86$ gdb libnative-lib.so
Reading symbols from libnative-lib.so…(no debugging symbols found)…done.

Kết nối đến gdbserver:

pwndbg> target remote 192.168.59.101:1234

Kết nối đến gdbserver

Tuy nhiên do pwndbg chưa load được hết các thư viện của ứng dụng nên pwndbg không resolve được toàn bộ symbol của thư viện. Ta cần load các thư viện cho nó:

pwndbg> set solib-search-path lib
Reading /system/bin/linker from remote target…
Reading symbols from /home/phi/lab-android/MyApplication6/reverse/apktool/lib/x86/lib/libutils.so…(no debugging symbols found)…done.
Reading symbols from /home/phi/lab-android/MyApplication6/reverse/apktool/lib/x86/lib/libstdc++.so…(no debugging symbols found)…done….

Sau khi load đủ thư viện, ta chạy lệnh context để kiểm tra chương trình đã load thành công các symbol của thư viện chưa:

chạy lệnh context để kiểm tra chương trình

Bước 3: Debug ứng dụng

Tiếp theo ta đặt breakpoint tại Java_com_example_phi_myapplication6_MainActivity_getStringRandon để debug thử.

pwndbg> disassemble Java_com_example_phi_myapplication6_MainActivity_getStringRandom
Dump of assembler code for function Java_com_example_phi_myapplication6_MainActivity_getStringRandom:
0x00007fc0 <+0>:   Cannot access memory at address 0x7fc0

Chương trình báo lỗi vì không truy cập được địa chỉ này. Nguyên nhân là do gdb chưa tính đúng địa chỉ của hàm sau khi đã load lên bộ nhớ mà sử dụng offset của hàm trong thư viện.

Địa chỉ này sẽ được tính như sau:

Địa chỉ tương đối = địa chỉ base của thư viện libnative-lib.so + offset của hàm trong thư viện

Sử dụng lệnh vmmap để lấy địa chỉ của thư viện libnative-lib.so sau khi được load vào chương trình.

Sử dụng lệnh vmmap

Đặt breakpoint theo công thức trên

Địa chỉ thư viện libnative-lib.so: 0xe3005000

Địa chỉ của hàm Java_com_example_phi_myapplication6_MainActivity_getStringRandom trong thư viện libnative-lib.so: 0xe300cfc0

pwndbg> b*0xe3005000+0x00007fc0
Breakpoint 1 at 0xe300cfc0

Nếu làm đúng sau khi gõ lệnh continue chương trình pwndbg sẽ nhảy đúng vào hàm Java_com_example_phi_myapplication6_MainActivity_getStringRandom mà cần debug. Chúng ta sẽ thu được kết quả như bên dưới:

kết quả debug

Trên đây là hướng dẫn debug code native android, tham khảo thêm:

Hướng dẫn Pentest Black Box sử dụng Burp Suite

Phân tích mã độc có đuôi .scr

Hướng dẫn cài đặt môi trường tìm và khai thác lỗi phần mềm trên kiến trúc ARM

Hướng dẫn tạo Plugin cho SublimeText

Demo khai thác lỗ hổng SambaCry

Khai thác lỗ hổng Apache Struts và hướng dẫn phòng thủ với Contrast Security

Tags: ,