약간의 함수 트레이서를 쓰고 싶습니다. 나는 ptrace를 사용한다. 우분투 x86_64에 있습니다. 공유 라이브러리 기능 (예 : printf
)의 주소를 찾고 싶습니다.엘프 바이너리에서 GOT 항목 읽기
하지만 글로벌 오프셋 테이블에 대한 몇 가지 질문과 질문이 있습니다.
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));
추적 된 프로세스의 메모리에 읽기 기능 readMemory
: 나는 다음과 같은 코드가 있습니다.
linkList->l_ld
을 읽으려고 할 때 동적 섹션을 가리 키지 않는 것 같습니다.
내 코드가 맞는지 잘 모르겠습니다. readelf
을 사용하면 GOT 섹션의 주소가 내 프로그램과 동일합니다.
GOT 섹션 이상의 첫 번째 오프셋 만 읽어야합니까? GOT 진입 점에는 struct link_map
을 가리키는 절대 주소 만 포함됩니까?
감사합니다.
나는 C의 조금 알고 있지만, C++을 잘 모릅니다. 그러나 어쨌든, 나는이 질문을 이해할 수 없다. 이것은 C++로 재 태그되어야 하는가 ??? – Alphaneo
제공된 소스가 C++이므로 질문의 태그를 다시 지정했습니다. – jschmier