OWASP MASTG 安卓逆向实践:从 Android ELF 二进制中提取调试信息与符号表 文档教程网络安全【免费下载链接】mastgThe OWASP Mobile Application Security Testing Guide (MASTG) is a comprehensive manual for mobile app security testing and reverse engineering. It describes technical processes for verifying the OWASP Mobile Security Weakness Enumeration (MASWE) weaknesses, which are in alignment with the OWASP MASVS.项目地址https://gitcode.com/gh_mirrors/ow/mastg点击查看免费下载导读在 Android 应用的逆向工程与漏洞分析中native 层.so动态库往往是安全测试的关键战场而符号与调试信息则是解读 native 代码的第一把钥匙它们能直接暴露函数名、变量名、源文件行号甚至还原出 JNI 桥接函数的完整签名。本文基于 OWASP Mobile Application Security Testing GuideMASTG的 MASTG-TECH-0140系统讲解如何利用 radare2、objdump、nm 三套工具判断 ELF 二进制是否被 strip剥离符号并从中提取调试符号、导入/导出符号与 JNI 符号。读完本文你将掌握一套不依赖任何图形界面、可复现的纯命令行符号提取工作流能够快速判断一个 Android native 库的可读性为后续反汇编与动态调试打下基础。背景为什么符号信息对 Android 逆向如此重要Android 的 native 代码C/C被编译为 ELF 格式的动态库.so并由 Java 层通过System.loadLibrary在运行时加载。这些库中的符号表记录了函数与全局变量的名称、类型、绑定属性GLOBAL/WEAK/LOCAL以及地址信息。对于逆向分析者而言未剥离unstripped的二进制保留了完整的符号表Java_sg_vantagepoint_helloworldjni_MainActivity_stringFromJNI这类 JNI 符号可以直接告诉我们 Java 方法与 native 函数的对应关系剥离stripped的二进制删除了符号表只剩下地址和指令流分析难度显著上升。因此拿到一个 APK 后第一步往往不是直接反汇编而是先回答三个问题这个.so是否被 strip它保留了哪些符号行号信息是否还在这正是本文要解决的核心问题。MASTG 仓库提供了可直接用于实验的样本 Samples/Android/01_HelloWorld-JNI/HelloWord-JNI.apk其lib/armeabi-v7a/libnative-lib.so中导出的Java_sg_vantagepoint_helloworldjni_MainActivity_stringFromJNI是贯穿全文的示例符号该样本的完整反汇编分析见 MASTG-TECH-0018。方法一radare2 符号检查与导出符号枚举radare2r2是 MASTG 推荐的通用二进制分析框架支持 Android 的 DEX、ELF可执行文件、.so、ART及 JavaJNI 与 Java 类等多种格式详见工具页 MASTG-TOOL-0028。它既能以r2交互式 shell 使用也能通过rabin2等独立 CLI 工具完成信息提取MASTG-TOOL-0129。快速判断二进制是否被 strip在 r2 shell 中加载目标库后执行以下命令即可一次性查看三项关键属性[0x0003e360] i~stripped,linenum,lsyms linenum true lsyms true stripped false对输出逐项解读stripped为false表示调试符号存在二进制未被剥离linenum为true表示行号信息可用即编译时保留了与源文件的对应关系lsyms为true表示本地局部符号存在。这三个字段全部来自 ELF 文件头与符号段.symtab/.dynsym的元信息r2 在加载文件时即可解析无需执行耗时的代码分析。用is枚举导入/导出符号r2 的is命令用于列出从 ELF 符号表解析出的导入与导出符号。先使用-A参数加载并分析示例库再执行isr2 -A libnative-lib.so [0x00000e3c] is nth paddr vaddr bind type size lib name demangled ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― 3 0x00000e78 0x00000e78 GLOBAL FUNC 16 Java_sg_vantagepoint_helloworldjni_MainActivity_stringFromJNI 4 0x00001578 0x00001578 GLOBAL FUNC 4 __aeabi_unwind_cpp_pr0 5 ---------- 0x00003004 GLOBAL NOTYPE 0 _edata 6 ---------- 0x00003004 GLOBAL NOTYPE 0 _end 7 ---------- 0x00003004 GLOBAL NOTYPE 0 __bss_start 10 0x0000157c 0x0000157c WEAK FUNC 4 __aeabi_unwind_cpp_pr1 11 0x00001580 0x00001580 WEAK FUNC 4 __aeabi_unwind_cpp_pr2 13 0x000017dc 0x000017dc GLOBAL FUNC 0 __gnu_Unwind_Restore_VFP_D ...输出列的含义nth符号在符号表中的序号paddr/vaddr物理地址文件偏移与虚拟地址加载后地址bind绑定类型GLOBAL全局、WEAK弱等type符号类型FUNC函数、NOTYPE无类型如段边界标记size符号占用的字节大小name符号名本例中的Java_sg_vantagepoint_helloworldjni_MainActivity_stringFromJNI正是 JNI 层导出的入口函数。注意_edata、_end、__bss_start这类 NOTYPE 符号是链接器生成的段边界标记并非业务函数分析时可将其与__aeabi_unwind_cpp_pr*等运行时辅助函数一并忽略。聚焦 JNI 符号逆向 Android 应用时JNI 符号的价值最高——它直接揭示 Java 类与方法与 native 函数的映射。r2 支持用~管道符对命令输出做过滤~JNI即可只保留含 JNI 的行[0x00000e3c] is~JNI同样的需求也可以直接在 shell 中使用rabin2 -s完成rabin2 -s libnative-lib.so | grep JNIMASTG-TECH-0018 中给出了该命令在 HelloWorld-JNI 样本上的实际输出可与 r2 内部结果互相印证$ rabin2 -s HelloWord-JNI/lib/armeabi-v7a/libnative-lib.so | grep -i Java 003 0x00000e78 0x00000e78 GLOBAL FUNC 16 Java_sg_vantagepoint_helloworldjni_MainActivity_stringFromJNI提示rabin2是 radare2 框架中的独立二进制信息提取工具支持 ELF、Mach-O、PE、Java CLASS 等多种格式能输出符号导入/导出、库依赖、字符串、交叉引用、入口点与架构类型等信息输出格式可与 radare2 及其他工具对接MASTG-TOOL-0129。方法二objdump 检查调试符号GNU binutils 中的objdump提供--syms选项用于展示 ELF 文件的符号表。对比两个示例文件的输出可以直观看出有无符号的差别objdump --syms libnative-lib.so libnative-lib.so: file format elf32-littlearm SYMBOL TABLE:libnative-lib.so的符号表为空说明该二进制已被 strip没有任何可用的调试符号。再看未剥离的版本objdump --syms libunstripped.so libunstripped.so: file format elf32-littlearm SYMBOL TABLE: 00000000 l df *ABS* 00000000 crtbegin_so.c 000315d8 l .text 00000000 $a.0 000315e8 l .text 00000000 $a.2 0003161c l .text 00000000 $a.4 000315e4 l .text 00000000 $d.1 00031614 l .text 00000000 $d.3 ...这里l表示局部local符号df表示调试文件debug file后面的crtbegin_so.c等源文件名直接证明调试符号含源文件信息仍然存在。方法三nm 提取符号表并对比判断剥离状态nm是 GNU binutils 中专门显示二进制符号表name list的工具MASTG 为其建立了独立的工具页 MASTG-TOOL-0003。它可以从 ELF 文件中检索符号表并区分全局可见符号与仅存在于.symtab中的本地static符号。对已剥离的库nm直接报告无符号nm libnative-lib.so libnative-lib.so: no symbols如果二进制保留符号nm会列出全局可见的函数名与变量名而nm -a会额外显示所有符号包括本地static符号——但前提是.symtab段仍然存在。因此比较nm与nm -a的输出差异是判断是否剥离了调试符号的经典方法diff (nm libnative-lib.so) (nm -a libnative-lib.so)如果输出为空调试符号已被剥离如果出现带函数名或源文件引用的条目符号仍然存在。对未剥离库执行同样的比较差异行会包含源文件信息例如diff (nm libunstripped.so) (nm -a libunstripped.so) | tail 3871a31083,31086 00000000 a stdexcept.cpp 00000000 a stdlib_exception.cpp 00000000 a stdlib_stdexcept.cpp 00000000 a stdlib_typeinfo.cpp 3875a31091 00000000 a string.cpp 3888a31105,31106 00000000 a system_error.cpp 00000000 a thread.cpp输出中a表示绝对符号absolute symbol这些*.cpp条目是 C 标准库的源文件引用它们的出现说明.symtab中保留了丰富的调试符号信息。三种方法的选型与互补工具命令典型用途优势radare2ii~stripped,linenum,lsyms一键判断剥离状态、行号、本地符号交互式可无缝衔接后续反汇编radare2is/ rabin2is/rabin2 -s枚举导入/导出符号过滤 JNI 符号与反汇编工作流一体objdumpobjdump --syms查看完整符号表含局部符号GNU binutils 自带无需额外安装nmnm与nm -a对比区分全局/本地符号、判断是否剥离输出简洁便于脚本化三者都只做静态解析成本低、速度快适合在开始正式反汇编之前快速摸清目标库的底细。radare2 的优势在于它是完整的逆向框架拿到符号信息后可直接在同一 shell 中继续反汇编objdump 与 nm 则适合在 shell 脚本或自动化检查中批量使用。实战要点与仓库内延伸阅读实验样本使用 Samples/Android/01_HelloWorld-JNI/HelloWord-JNI.apk 可完整复现本文所有命令。该 APK 的lib目录下按 ABIarmeabi、armeabi-v7a、arm64-v8a 等分目录存放libnative-lib.so各架构版本编译自同一份源码功能一致若计划后续在真机调试建议优先选择 ARM 架构版本详见 MASTG-TECH-0018。符号信息与安全特性检查符号表不仅能帮助逆向还能用于安全测试。例如 MASTG-TEST-0044 使用rabin2 -I检查 native 库的canary栈保护与pic位置无关代码加固属性这与符号提取属于同一类二进制元信息审计思路。下一步反汇编确认符号存在后可在 r2 中继续使用pd/pdf查看反汇编或进入 Visual Mode、Graph Mode 追踪代码流程参见 MASTG-TOOL-0028 与 MASTG-TECH-0018。小结判定一个 Android ELF 库的可读性并不需要复杂的工具链radare2 的i与is、objdump 的--syms、nm 的-a对比三套方案互相印证即可完整回答是否被 strip、保留哪些符号、是否含行号信息这三个核心问题。掌握这一工作流是 Android native 逆向的第一步也是评估应用加固与混淆效果剥离符号是最基础的缓解手段的重要依据。赞分享文档教程网络安全【免费下载链接】mastgThe OWASP Mobile Application Security Testing Guide (MASTG) is a comprehensive manual for mobile app security testing and reverse engineering. It describes technical processes for verifying the OWASP Mobile Security Weakness Enumeration (MASWE) weaknesses, which are in alignment with the OWASP MASVS.项目地址https://gitcode.com/gh_mirrors/ow/mastg点击查看免费下载相关推荐OWASP MASTG 技术指南Android 二进制字符串提取Retrieving Strings实战OWASP MASTG 技术指南Android 二进制字符串提取Retrieving Strings实战 在 Android 应用安全测试与逆向工程中字文档教程网络安全OWASP MASTG 系列Android 原生库调试信息与调试符号Debug Symbols检测指南OWASP MASTG 系列Android 原生库调试信息与调试符号Debug Symbols检测指南 本文对应 OWASP MASTG 知识条目 MAS文档教程网络安全从 iOS 二进制中提取调试符号radare2、objdump 与 nm 实战指南从 iOS 二进制中提取调试符号radare2、objdump 与 nm 实战指南 调试符号Debug Symbols是 iOS 安全测试与逆向工程中的关文档教程网络安全上一篇Kaggler数据I/O高效处理CSV、LibSVM和HDF5格式的终极指南 下一篇5 分钟在终端跑起 AI 编程助手OpenCode 快速部署完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考