繁体   English   中英

在ELF或DWARF中,如何获取.PLT节值? —尝试获取检测工具所在位置的函数地址

[英]In ELF or DWARF, how can I get .PLT section values? — Trying to get the address of a function on where an instrumentation tool is in

我正在使用其ELF和DWARF信息并通过将Pin工具钩到当前正在运行的进程来获取程序的所有数据-这是一种使用Pin工具的调试器。

为了从堆栈中获取局部变量,我正在使用我可以从Pin访问的寄存器EIP,EBP和ESP。

令我感到奇怪的是,我期望EIP指向将pin工具连接到该流程时正在运行的当前功能,而EIP却指向.PLT部分。 换句话说,如果在Foo()运行时将pin工具挂接到进程中,那么我期望EIP指向Foo函数中的某个地址。 但是,它指向.PLT部分的开头。

我需要知道的是进程当前正在使用哪个函数-是否可以使用.PLT节获取函数的地址? 还有其他方法可以从堆栈或使用Pin获取功能的地址吗? 我希望我已经足够清楚了,但是请问是否有任何问题。

我可能不太清楚这里发生了什么...指令指针确实在.plt节中,还是您只是从Pin中获得了垃圾值?

您将要读取的指令指针命名为EIP,如果在64位系统上运行,可能会出现问题,是这样吗? 您会看到指令指针寄存器在32位系统上是32位值,在64位系统上是64位值。 因此,Pin实际上为指令指针提供了3个REG_ *名称:EIP,RIP和GBP。 根据您的体系结构,EIP始终是寄存器的低32位一半,RIP始终是寄存器的64位值,GBP是这两者的其中之一。 在64位系统上要求EIP会给您带来垃圾,就像在32位系统上要求RIP一样。

否则,快速浏览一下Google就会发现这一点 引用一下:

默认情况下,链接器会全部初始化.plt条目,而不是指向正确的目标函数,而是指向动态加载器本身。 因此,第一次调用任何给定函数时,动态加载程序将查找该函数并修复.plt的目标,以便下次使用此.plt插槽时,我们将调用正确的函数。

更重要的是:

可以指示动态加载程序在将控制权转移到应用程序之前将地址绑定到所有.plt插槽。这是通过在运行程序之前设置环境变量LD_BIND_NOW = 1来完成的。 例如,这在某些情况下在调试程序时很有用。

希望能有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM