Quiero escribir el pequeño trazador de una función. Yo uso ptrace. Estoy en ubuntu x86_64. Quiero encontrar la dirección de la función de biblioteca compartida (como printf
).Leer la entrada GOT en Elf Binary
Pero tengo algunos problemas y algunas preguntas sobre la tabla de compensación global. Tengo el siguiente código:
size_t baseAddress = this->getBaseAddress();
Elf_Ehdr const * headerElf = static_cast<Elf_Ehdr const *> (this->_manager.readMemory((void*) baseAddress, sizeof (Elf_Ehdr)));
Elf_Phdr const * headerProgram = static_cast<Elf_Phdr const *> (this->_manager.readMemory((void*) (baseAddress + headerElf->e_phoff), headerElf->e_phentsize * headerElf->e_phnum));
unsigned int i = 0;
while (headerProgram[i].p_type != PT_DYNAMIC)
{
++i;
}
size_t addrToRead = headerProgram[i].p_vaddr;
Elf_Dyn const * dynSection = static_cast<Elf_Dyn const *> (this->_manager.readMemory((void*) addrToRead, sizeof (Elf_Dyn)));
while (dynSection->d_tag != DT_PLTGOT)
{
addrToRead += sizeof (Elf_Dyn);
dynSection = static_cast<Elf_Dyn const *> (this->_manager.readMemory((void*) addrToRead, sizeof (Elf_Dyn)));
}
size_t addrGot = dynSection->d_un.d_ptr/* + (4 * sizeof (Elf64_Word))*/;
std::cout << "addr got = " << std::hex << "0x" << dynSection->d_un.d_ptr << " 0x" << addrGot << std::endl;
Elf64_Word const * temp = (Elf64_Word const *) this->_manager.readMemory((void*) addrGot, sizeof (Elf64_Word));
struct link_map * linkList = (struct link_map *) this->_manager.readMemory((void*) *temp, sizeof (struct link_map));
La función readMemory
leer en la memoria del proceso de trazado.
Cuando intento leer el linkList->l_ld
, no parece apuntar en una sección dinámica.
No estoy seguro de que mi código sea correcto. Cuando uso readelf
, la dirección de la sección GOT es la misma que la encontrada en mi programa.
Debo leer solo el primer desplazamiento de la sección GOT o más? El punto de entrada GOT contiene solo la dirección absoluta que apunta a struct link_map
?
Gracias.
Conozco un poco de C, pero no saben C++. Pero de todos modos, no puedo entender esta pregunta. ¿Debería repasarse como C++? – Alphaneo
Dado que la fuente proporcionada es C++, he resuelto la pregunta. – jschmier