c-在精灵或矮人中,如何获得.plt节值? - 试图在仪器工具所在的位置上获取功能的地址



我正在努力使用其精灵和矮人信息获得程序的所有数据,并通过将PIN工具挂接到当前正在运行的过程中 - 它是一种使用的调试器销钉工具。

从我可以从PIN上访问的寄存器EIP,EBP和ESP的堆栈中获取本地变量。

让我感到奇怪的是,我希望EIP指向将PIN工具连接到该过程时正在运行的当前功能,而EIP则指向了" .plt"部分。换句话说,如果在Foo()运行FOO()运行时将PIN工具挂在过程中,那么我希望EIP指向FOO函数中的某个地址。但是,它指向.plt部分的开始。

我需要知道的是该过程当前所在的功能 - 有什么方法可以使用.plt部分获取函数的地址?还有其他方法可以从堆栈或使用PIN获取功能的地址吗?我希望我很清楚,让我知道是否有任何问题。

我可能不完全理解这里发生了什么...指令指针在.plt部分中确实是在.plt部分中还是从PIN中获得垃圾值?

您命名您正在阅读EIP的指令指针,如果您在64位系统上运行,这可能是一个问题吗?您会看到指令指针寄存器是32位系统上的32位值,而64位系统上的值为64位值。因此,PIN实际上为指令指针提供了3个reg_*名称:EIP,RIP和GBP。EIP始终是寄存器的较低32位,撕裂64位值,而GBP则取决于您的体系结构。在64位系统上要求EIP会给您垃圾,同样,在32位上要求RIP。

否则,快速查看Google会给我这个。引用一点:

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

,更重要的是:

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

希望会有所帮助。

最新更新