2012-05-14 92 views
4

命令可以更改动态libc.so地址?

gcc main.c -o main 
ldd main 

产量

linux-gate.so.1 => (0x00f67000) 
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00b7d000) 
/lib/ld-linux.so.2 (0x00ae5000) 

是否有可能改变libc.so.6的地方将内存映射的地址?例如,将libc.so.6改为映射到0xb0000000。

我运行Xubuntu上32位:Linux的3.2.0-23-i686的通用i686的的i386 GNU/Linux的

+0

你为什么要问的路径呢?另请参阅http://en.wikipedia.org/wiki/Address_space_layout_randomization –

+0

为了执行一些ret2libc缓冲区溢出攻击,有效负载字符串必须包含一些libc函数的地址,这些函数不在我的plt部分二进制文件。该字符串不应该包含任何\ x00字节,因此我希望将libc库更高地放在内存中。请注意,这只是一个自定义的“训练二进制”。 ASLR在我的系统上暂时被禁用(这仅仅是一个虚拟机,因此它没有任何伤害)。 – ldso

回答

2

有一个prelink实用程序(wiki page)能够改变加载地址(它被称为“基地地址“)这样的库。

有一个关于如何预链接的作品的一些信息:http://www.acsu.buffalo.edu/~charngda/elf.html

这是什么预链接呢?将用户程序地址空间中的实际地址加载到内存中时,它将动态库的基址更改为实际地址。当然,ld.so会识别GNU_PRELINKED标签,并会将一个动态库加载到其基址中(回想起mmap的第一个参数是首选地址;当然,这取决于操作系统。)

通常情况下,动态库被建立为独立于位置的代码,即-fPIC编译器命令行选项,因此基地址为0.例如,正常的libc.so具有如下的ELF程序头(readelf -l命令)...

根据man prelink有预链接效用的一个选项,以变基(移居)给定的库到指定的地址:

-r --reloc-only=ADDRESS 而不是预链接,只是将给定的共享库重新链接到指定的基地址。

prelink --reloc-only=0x7896000 libc.so.6应该足以实现您想要的更改。

PS:你可以做你的本地libc中的副本,这个搬迁,然后给通过export LD_LIBRARY_PATH=/path/to/your/rebased/copy:$LD_LIBRARY_PATH