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和安全相关的一些信息。
可从此处完成的操作:
- 使用 Google 阅读器订阅Dutor
- 开始使用 Google 阅读器,轻松地与您喜爱的所有网站保持同步更新
没有评论:
发表评论