使用AFL++ Frida模式对Android二进制文件进行模糊测试
使用AFL++ Frida模式对Android二进制文件进行模糊测试
你可能会觉得这是我之前关于《在Android C/C++应用中创建和使用JVM实例》文章的合适序言...没错!这算是我通过展示最终目标来吸引你的方式。毕竟,我们常常会浏览各种文章却不清楚它们的具体目标。
如果你对模糊测试感兴趣或正考虑探索这个领域,本文将作为配置AFL++并使用它来测试Android二进制文件的逐步指南。我会尽量简洁,避免那些关于"如何搭建Android渗透测试环境"的无聊段落。如果你不知道什么是模糊测试或AFL,网上有成千上万的入门文章可供参考。
我在运行Sonoma 14.4.1系统的MacBook Pro M1上按照以下步骤设置了AFL++(Frida模式),但相信你在自己的系统上不会遇到太多问题。
设置AFL++
-
从以下地址下载最新版本:https://github.com/AFLplusplus/AFLplusplus/releases/ 并解压文件。
-
使用brew安装Android-ndk:
$ brew install --cask android-ndk
$ export ANDROID_NDK_HOME="/opt/homebrew/share/android-ndk"
将ANDROID_NDK_HOME设置为永久环境变量,这样就不必每次启动shell会话时重新定义。根据你的操作系统和shell,可以将export ANDROID_NDK_HOME='/opt/homebrew/share/android-ndk'
添加到shell配置文件(如使用zsh则是~/.zshrc)。
- 下载以下CMAKE文件并保存到AFL解压目录(第一步):
https://github.com/Ch0pin/android-fuzzing/blob/main/AFLplusplus/CMakeLists.txt
如果遇到问题,可能需要修改这部分:
execute_process(
COMMAND
bash -c "echo 'unsigned char api_js[] = {' > ${API_C}; \
xxd -p -c 12 ${API_JS} | sed -e \"s/\\([0-9a-f]\\{2\\}\\)/0x\\1, /g\" \
| sed -e \"s/^/ /\" >> ${API_C}; \
echo '};' >> ${API_C}; \
echo \"unsigned int api_js_len = $(stat --printf='%s' ${API_JS});\" \
>> ${API_C}"
)
修改为:
execute_process(
COMMAND
bash -c "echo 'unsigned char api_js[] = {' > ${API_C}; \
xxd -p -c 12 ${API_JS} | sed -e \"s/\\([0-9a-f]\\{2\\}\\)/0x\\1, /g\" \
| sed -e \"s/^/ /\" >> ${API_C}; \
echo '};' >> ${API_C}; \
echo \"unsigned int api_js_len = $(stat ${API_JS} | cut -d ' ' -f 8);\" \
>> ${API_C}"
)
- 将以下脚本保存到AFL下载目录并运行,以编译afl-fuzz和afl-frida-trace.so:
mkdir build && cd build
cmake -DANDROID_PLATFORM=31 \
-DCMAKE_TOOLCHAIN_FILE=/opt/android-ndk-r25c/build/cmake/android.toolchain.cmake \
-DANDROID_ABI=arm64-v8a ..
make
如果使用Brew安装,可能需要将DCMAKE_TOOLCHAIN_FILE值改为ndk的位置,通常在/opt/homebrew/Cascroom/android-ndk下。
如果一切顺利
你可以在./build路径下找到afl-fuzz和afl-frida-trace.so。使用adb将这些二进制文件推送到/data/local/tmp:
$ adb push afl* /data/local/tmp
给afl-fuzz赋予执行权限。如果你按照我的指南操作,可能已经知道要测试什么。假设要测试的二进制文件名为'fuzz',可以这样开始:
./afl-fuzz -O -G 256 -i in -o out ./fuzz
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
公众号二维码