MASTG-TECH-0140: Obtendo Informações de Depuração e Símbolos
Se um binário não for stripped, você pode extrair símbolos de depuração usando ferramentas padrão de inspeção ELF. Esses símbolos podem fornecer informações sobre as funções e variáveis usadas no binário, o que é útil para engenharia reversa e análise de vulnerabilidades.
radare2¶
Para verificar se um binário é stripped, você pode usar radare2 para Android e executar o seguinte comando:
[0x0003e360]> i~stripped,linenum,lsyms
linenum true
lsyms true
stripped false
Neste exemplo:
strippedéfalse, indicando que símbolos de depuração estão presentes.linenumétrue, significando que informações de número de linha também estão disponíveis.lsymsétrue, indicando que símbolos locais estão presentes.
Você também pode listar símbolos importados e exportados analisados a partir das tabelas de símbolos ELF com o comando is:
r2 -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
...
Se você estiver interessado em símbolos JNI, pode filtrar a saída com ~JNI.
Alternativamente, você pode usar rabin2 para obter os símbolos executando rabin2 -s libnative-lib.so | grep JNI.
objdump¶
Você pode usar o objdump para inspecionar arquivos ELF em busca de símbolos de depuração usando o comando objdump --syms:
objdump --syms libnative-lib.so
libnative-lib.so: file format elf32-littlearm
SYMBOL TABLE:
Neste caso, a saída mostra que não há símbolos disponíveis, indicando que o binário é stripped.
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
...
nm¶
Com nm - Android você pode recuperar tabelas de símbolos de arquivos ELF.
nm libnative-lib.so
libnative-lib.so: no symbols
Isso mostra nomes de funções e variáveis globalmente disponíveis se o binário mantiver símbolos. nm -a exibe todos os símbolos, incluindo os locais (estáticos), que estão disponíveis apenas se .symtab estiver presente.
Para identificar a presença de símbolos de depuração, compare a saída de ambos os comandos:
diff <(nm libnative-lib.so) <(nm -a libnative-lib.so)
Se a saída estiver vazia, os símbolos de depuração foram removidos (stripped). Se você vir entradas com nomes de funções ou referências de origem, os símbolos estão presentes.
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