2012-05-14 120 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