2017-01-06 78 views
0

阅读thesequestions后,我正在查找有关如何控制符号解析顺序的更多详细信息。在不同的动态加载对象中以不同方式解析符号

在我的问题中,我有主要可执行文件execexec动态链接到a.soc.soa.so动态链接到b.sob.so调用函数foo,通常由c.so提供,但在这种情况下也由exec提供。 b.so只适用于c.sofoo的实施。

的情况的图:

exec  (foo caller and provider) 
    | \ 
a.so | 
    | | 
b.so | (foo caller) 
    |/
c.so  (foo provider) 

我只能控制的a.so编译/源,并且我链接a.soexecLD_PRELOAD

我想呼吁在execfoo解决到exec“在b.so的实现,并呼吁决心c.so的实现。这种类型的东西在不同的对象中具有不同的符号查找可能吗?

回答

0

不幸的是,没有办法在每个库级别调整符号分辨率,所以没有简单的方法来实现这一点。

如果foo在主要可执行实际执行(不只是copy-relocated它)有什么可以做,因为从主可执行文件符号解析过程中获得最高的优先级(除非你确定与GOT的最终哈克运行时的修补其你不是)。

但如果

  • foo在c.so
  • 实现和你拼命足够

,你可以做到以下几点:

  • 获取返回内拦截地址在a.so(使用__builtin_return_address
  • 匹配它b.so的边界取决于结果
  • (可以从/proc/self/maps获得),或者做特殊处理(如果呼叫者是在b.so)或RTLD_NEXT

此的前向呼叫当然有明显的局限性例如如果b.so调用另一个d.so的函数,则该函数将不起作用,然后调用foo,但在很多情况下它可能已足够。是的,我已经看到这种方法在实践中部署。

+0

我怎样才能用''dlsym''来做到这一点?我看到''a.so''怎么可以用''dlsym''来引用''c.so'''foo'',但是有没有办法使用''dlsym''来制作' 'b.so''使用它? –

+0

对不起,误解了这个问题。我已经更新了答案,希望现在更有帮助。 – yugr

+0

感谢您的编辑!然而,所有的依赖关系只在图中向下(''a.so''只能调用到''b。所以''),这意味着'__builtin_return_address'技巧将无法工作。另外,它实际上是在''exec''和''c.so''中''foo'的单独实现。 GOT黑客攻击中是否有任何资源(这不是我想去的道路,但是我想了解的东西)? –