Com um executável binário e um /proc/pid/maps de um processo que é gerado a partir dele, quero mapear um endereço de instrução de tempo de execução neste momento (pode ser recuperado pelo gdb ou qualquer depurador) para o endereço de instrução "estático" correspondente (pode ser recuperado pelo objdump, ida ou qualquer desmontador) no executável binário.
Por exemplo, para executáveis ​​PIE ou bibliotecas compartilhadas, isso é fácil:
xxxx-yyyy r-xp 0000000 ... path/to/mysharedlibrary.so
Então, para o endereço de tempo de execução zzzz
, seu endereço estático correspondente pode ser calculado por
static-address = zzzz - xxxx
O endereço calculado pode ser verificado consultando objdump ou IDA.
Entretanto, para executáveis ​​não PIE ou vinculados estaticamente, a regra acima não pode ser aplicada:
400000-yyyy r-xp 000000 ... path/to/executable
Não precisamos substituir o endereço base pelo endereço de tempo de execução; o endereço de tempo de execução é o mesmo que o endereço estático.
Gostaria de saber qual é a regra exata para calcular o endereço correto, já que as duas regras acima são baseadas completamente na experiência.
Também está incorreto . Ou melhor, só está correto quando o binário é vinculado no endereço
0
(o que geralmente é o caso paraET_DYNAMIC
(bibliotecas compartilhadas ePIE
binários), mas não é o caso quando a biblioteca compartilhada é pré-vinculada. Veja man prelink ).Você precisa de 2 números: endereço na memória (de
/proc/$pid/maps
) e o endereço vinculado (dereadelf -Wl
-- o primeiroPT_LOAD
segmento.p_vaddr
).Subtrair o segundo do primeiro resulta na realocação (diferença entre o que você vê em
nm
/objdump
etc. e o endereço real na memória).