Chinaunix

标题: 求助:为何调用过的动态链接库函数在.got.plt节中对应的槽不是函数真正的地址? [打印本页]

作者: Michaelbest002    时间: 2014-11-28 13:36
标题: 求助:为何调用过的动态链接库函数在.got.plt节中对应的槽不是函数真正的地址?
小弟我最近在研究动态链接库相关的问题。通过阅读一些资料明白了动态链接库函数的调用原理,即延迟绑定。于是决定自己做个实验试一试。
根据资料中所说,当函数调用过之后,该函数在.got.plt节中所对应的槽中应该填的就是函数真正的地址。但在实验中,我读取了相应位置的代码,发现还是plt节中第二条指令的地址。
我百思不得其解。哪位大神能帮小弟我解释一下?
我的测试程序:

  1. #include <stdio.h>
  2. #include <string.h>

  3. typedef unsigned long u_l;

  4. int main()
  5. {
  6.     char *p_ch = strstr("abc", "b");
  7.     printf("result = %s\n", p_ch);

  8.     long long *p = (long long *) &strstr;

  9.     printf("data = %llx\n", *(p));

  10.     long long k = *p >> 16;
  11.     u_l *entry_addr = (u_l *)(k & 0x00000000ffffffff);

  12.     printf("entry_addr = %lx\n", entry_addr);

  13.     u_l *func_addr = (u_l *)*entry_addr;
  14.     printf("func_addr = %lx\n", func_addr);
  15.     printf("code = %llx\n", *func_addr);
  16.     return 0;
  17. }
复制代码
输出:
result = bc
data = 680804a00c25ff
entry_addr = 804a00c
func_addr = 8048326
code = 68080400000068
作者: super皮波    时间: 2014-11-28 14:14
你这测试想达到什么目的,没看懂。。
作者: Michaelbest002    时间: 2014-11-28 15:00
回复 2# super皮波


    我是想去偷库函数的代码
作者: super皮波    时间: 2014-11-28 15:12
回复 3# Michaelbest002
偷?
你的偷指的是什么


   
作者: Michaelbest002    时间: 2014-11-28 16:41
回复 4# super皮波


    就是读取库函数的代码
作者: super皮波    时间: 2014-11-28 16:46
你链接到的库函数都是二进制的数据,你看不懂的
直接读库函数的源码
作者: super皮波    时间: 2014-11-28 16:47
库函数源码不用偷,有现在的,大大方方的就能读
作者: super皮波    时间: 2014-11-28 16:47
有现成的,大大方方的就能读
作者: Michaelbest002    时间: 2014-11-30 08:26
回复 8# super皮波


    我当然知道可以大大方方的读的呀,我不会笨到那个地步。这么干自然有我的目的呀。
作者: super皮波    时间: 2014-11-30 09:49
回复 9# Michaelbest002
什么目的?


   
作者: Michaelbest002    时间: 2014-11-30 14:11
回复 10# super皮波


    做学术研究。哥们如果有兴趣可以去搜搜JIT-ROP (Just-in-time Return-Oriented Programming)。我这个只是个简单的实验。
作者: super皮波    时间: 2014-11-30 16:22
没接触过JIT-ROP
作者: super皮波    时间: 2014-11-30 16:22
没接触过JIT-ROP




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2