Skip to content

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