LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 778|回复: 0

[原创]Elf动态解析符号过程-演示

[复制链接]
发表于 2005-6-15 12:53:29 | 显示全部楼层 |阅读模式
程序源码:
  1. #include <stdio.h>
  2. int main(int argc, char *argv[])
  3. {
  4.   printf("Hello, world\n");
  5.   printf("test for another time\n");

  6. return 0;
  7. }
复制代码

相关的节:
  1. .got 节的内容:
  2. 80495e8 0c950408 00000000 00000000 a6820408  ................
  3. 80495f8 b6820408 00000000                    ........        
  4. .plt 节的内容:
  5. 8048290 ff35ec95 0408ff25 f0950408 00000000  .5.....%........
  6. 80482a0 ff25f495 04086800 000000e9 e0ffffff  .%....h.........
  7. 80482b0 ff25f895 04086808 000000e9 d0ffffff  .%....h.........00000000   
复制代码

以上来自objdump -s elf_test输出
.got节存放global offset table---全局偏移表
.plt节存放动态过程联接表
  1. linuxbuddy@l1u6uddy:~$ gdb -q elf_test
  2. Using host libthread_db library "/lib/libthread_db.so.1".
  3. (gdb) disass main
  4. Dump of assembler code for function main:
  5. 0x08048384 <main+0>:    push   %ebp
  6. 0x08048385 <main+1>:    mov    %esp,%ebp
  7. 0x08048387 <main+3>:    sub    $0x8,%esp
  8. 0x0804838a <main+6>:    and    $0xfffffff0,%esp
  9. 0x0804838d <main+9>:    mov    $0x0,%eax
  10. 0x08048392 <main+14>:   sub    %eax,%esp
  11. 0x08048394 <main+16>:   movl   $0x80484d4,(%esp)
  12. 0x0804839b <main+23>:   call   0x80482b0 <_init+56>//call printf
  13. 0x080483a0 <main+28>:   movl   $0x80484e2,(%esp)
  14. 0x080483a7 <main+35>:   call   0x80482b0 <_init+56>//call printf
  15. 0x080483ac <main+40>:   mov    $0x0,%eax
  16. 0x080483b1 <main+45>:   leave
  17. 0x080483b2 <main+46>:   ret
  18. End of assembler dump.
  19. (gdb) b *0x0804839b //在call printf前设置断点
  20. Breakpoint 1 at 0x804839b: file elf_test.c, line 4.
  21. (gdb) r
  22. Starting program: /home/linuxbuddy/libpcap/mysniffer/elf_test

  23. Breakpoint 1, 0x0804839b in main (argc=1, argv=0xbffff994) at elf_test.c:4
  24. 4         printf("Hello, world\n");
  25. (gdb) info address printf //查看prinf的地址
  26. Symbol "printf" is at 0x4006f960 in a file compiled without debugging.
  27. (gdb) disass  0x80482b0  0x80482bc
  28. Dump of assembler code from 0x80482b0 to 0x80482bc:
  29. 0x080482b0 <_init+56>:  jmp    *0x80495f8
  30. 0x080482b6 <_init+62>:  push   $0x8
  31. 0x080482bb <_init+67>:  jmp    0x8048290 <_init+24>
  32. End of assembler dump.
  33. (gdb) watch *0x80495f8 //设置观察点
  34. Hardware watchpoint 2: *134518264
  35. (gdb) p/a 0x80495f8
  36. $3 = 0x80495f8 <_GLOBAL_OFFSET_TABLE_+16>// 0x80495f8为全局偏移表的一个表项
  37. (gdb) p/a *0x80495f8//其内容为
  38. $4 = 0x80482b6 <_init+62> //正好是"0x080482b0 <_init+56>:  jmp    *0x80495f8"的下一条指令
  39. (gdb) l
  40. 1       #include <stdio.h>
  41. 2       int main(int argc, char *argv[])
  42. 3       {
  43. 4         printf("Hello, world\n");
  44. 5         printf("test for another time\n");
  45. 6
  46. 7       return 0;
  47. 8       }
  48. (gdb) b 5 //在第二次printf处设置断点
  49. Breakpoint 3 at 0x80483a0: file elf_test.c, line 5.
  50. (gdb) c
  51. Continuing.
  52. Hardware watchpoint 2: *134518264

  53. Old value = 134513334
  54. New value = 1074198880 //ld-linux.so.2修改全局偏移表
  55. 0x4000bacb in _dl_map_object_deps () from /lib/ld-linux.so.2
  56. (gdb) p/a *0x80495f8 //修改后的内容为
  57. $5 = 0x4006f960 <printf> //ld-linux.so.2修改全局偏移表中关于printf的相应项为printf函数的绝对地址
  58. (gdb) info symbol  0x4006f960 //确认一下下
  59. printf in section .text
  60. (gdb) c
  61. Continuing.
  62. Hello, world

  63. Breakpoint 3, main (argc=1, argv=0xbffff994) at elf_test.c:5
  64. 5         printf("test for another time\n");
  65. (gdb) disass  0x80482b0  0x80482bc
  66. Dump of assembler code from 0x80482b0 to 0x80482bc:
  67. 0x080482b0 <_init+56>:  jmp    *0x80495f8
  68. 0x080482b6 <_init+62>:  push   $0x8
  69. 0x080482bb <_init+67>:  jmp    0x8048290 <_init+24>
  70. End of assembler dump.
  71. (gdb) p/a *0x80495f8
  72. $6 = 0x4006f960 <printf>
  73. (gdb) c
  74. Continuing.
  75. test for another time

  76. Program exited normally.
  77. (gdb) q
复制代码

具体参见http://elfhack.whitecell.org/myd ... resolve_process.txt
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表