2012年7月27日星期五

创建可执行的共享库

 
 

satan 通过 Google 阅读器发送给您的内容:

 
 

于 12-7-23 通过 Dutor 作者:dutor

  偶然发现glibc提供的libc.so是"可执行的",这是快速查看glibc版本的一种方法,

1  2  3  4  5  6  7  
~$ /lib/i386-linux-gnu/libc.so.6  GNU C Library (Ubuntu EGLIBC 2.13-20ubuntu5.1) stable release version 2.13, by Roland McGrath et al.  Copyright (C) 2011 Free Software Foundation, Inc.  ...  Compiled by GNU CC version 4.6.1.  Compiled on a Linux 3.0.17 system on 2012-03-07.  ...

  这是gcc提供的一种叫做PIE(Position Independent Executable)的特性,可以创建位置无关的可以执行对象。它可以像共享库一样被加载到任何地址上执行。使用gcc的PIE相关选项可以创建这种共享库:

1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  
//~ echo.c  #include <stdio.h>  void echo(const char *s) {      printf("%s\n", s);  }  int main() {      char s[64];      snprintf(s, sizeof(s), "echo from %s in %s:%d", __func__, __FILE__, __LINE__);      echo(s);      return 0;  }  //~ main.c  #include <stdio.h>  extern void echo(const char*);  int main() {      char s[64];      snprintf(s, sizeof(s), "echo from %s in %s:%d", __func__, __FILE__, __LINE__);      echo(s);      return 0;  }
1  2  3  4  5  6  7  
$ # -E let ld export dynamic symbols explicitly  $ cc -fPIC -pie -shared -Wl,-E -o libecho.so echo.c   $ cc main.c -L. -lecho -o main  $ ./libecho.so  echo from main in echo.c:8  $ LD_LIBRARY_PATH=. ./main  echo from main in main.c:6

  使用objdump反汇编libecho.so,会看到,它同普通的so一样没有使用虚拟空间的绝对地址,但libecho.so中却含有_start符号(gcc生成的可执行程序的入口点)。

1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21  
$ objdump -d libecho.so  000005d0 <_start>:   5d0:	31 ed                	xor    %ebp,%ebp   5d2:	5e                   	pop    %esi   5d3:	89 e1                	mov    %esp,%ecx   5d5:	83 e4 f0             	and    $0xfffffff0,%esp  ...  000006cc <echo>:   6cc:	55                   	push   %ebp   6cd:	89 e5                	mov    %esp,%ebp   6cf:	53                   	push   %ebx   6d0:	83 ec 14             	sub    $0x14,%esp   6d3:	e8 ef ff ff ff       	call   6c7 <__i686.get_pc_thunk.bx>   6d8:	81 c3 1c 19 00 00    	add    $0x191c,%ebx   6de:	8b 45 08             	mov    0x8(%ebp),%eax   6e1:	89 04 24             	mov    %eax,(%esp)   6e4:	e8 a7 fe ff ff       	call   590 <puts@plt>   6e9:	83 c4 14             	add    $0x14,%esp   6ec:	5b                   	pop    %ebx   6ed:	5d                   	pop    %ebp   6ee:	c3                   	ret

  更多关于PIE的信息,可以查看gcc中-fPIC/-fpic/-fPIE/-fpie/-pie选项,这篇文章还介绍了PIE和安全相关的一些信息。


 
 

可从此处完成的操作:

 
 

没有评论:

发表评论