में GOT प्रविष्टि पढ़ें मैं थोड़ा फ़ंक्शन का ट्रैसर लिखना चाहता हूं। मैं ptrace का उपयोग करें। मैं उबंटू x86_64 पर हूं। मैं साझा लाइब्रेरी फ़ंक्शन का पता ढूंढना चाहता हूं (जैसे printf
)।एल्फ बाइनरी
लेकिन मुझे कुछ समस्या है और ग्लोबल ऑफ़सेट टेबल के बारे में कुछ सवाल है।
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 प्रविष्टि बिंदु में केवल पूर्ण पता है जो struct link_map
पर इंगित करता है?
धन्यवाद।
मैं सी का एक सा पता है, लेकिन पता सी ++ नहीं है। लेकिन वैसे भी, मैं इस प्रश्न को समझने में सक्षम नहीं हूं। इसे सी ++ के रूप में रीटैग किया जाना चाहिए ??? – Alphaneo
चूंकि प्रदान किया गया स्रोत सी ++ है, इसलिए मैंने प्रश्न को दोबारा बदल दिया है। – jschmier