Linux中国 Linux中国门户站!
设为主页 设为主页
收藏本站 收藏本站
 
当前位置 :首页 ->Linux技术 ->系统管理 ->正文

Linux系统下解析Elf文件DT_RPATH后门

来源: 作者: 时间:2007-04-11 点击: [收藏] [投稿]

[ 8] 。rel。dyn REL 080488e4 0008e4 000030 08 A 4 0 4

[ 9] 。rel。plt REL 08048914 000914 000168 08 A 4 b 4

[11] 。plt PROGBITS 08048a94 000a94 0002e0 04 AX 0 0 4

[12] 。text PROGBITS 08048d80 000d80 003230 00 AX 0 0 16

[19] 。got PROGBITS 0804e554 005554 0000c4 04 WA 0 0 4

[20] 。dynamic DYNAMIC 0804e618 005618 0000d0 08 WA 5 0 4

注意LK字段“关联“的含义,。dynamic节关联着[5]。dynstr节,[4]。dynsym节也关联着。dynstr节,[8],[9]

节关联着。dynsym节

对每一个有该类型的object,d_tag控制着d_un的解释。

+ 图三: Dynamic Array Tags, d_tag

Name Value d_un Executable Shared Object

==== ===== ==== ========== =============

DT_NULL 0 ignored mandatory mandatory

DT_NEEDED 1 d_val optional optional

DT_STRTAB 5 d_ptr mandatory mandatory

[。。。]省略,保留了我们关心的

DT_RPATH 15 d_val optional ignored

[。。。]

DT_NULL标记的入口表示了_DYNAMIC数组,也既。dynamic节的结束。

DT_NEEDED这个entry, 这个元素保存着以NULL结尾的字符串表的偏移量,这些字符串是所需库的名字。该偏移量是以DT_STRTAB

为入口的表的索引。动态数组可能包含了多个这个类型的入口。那些入口的[[相关顺序]]是重要的。请注意相关顺序!---->注意

DT_STRTAB该元素保存着字符串表地址,在第一部分有描述,包括了符号名,库名, 和一些其他的在该表中的字符串。

DT_RPATH该元素在联合结构d_val保存着以NULL结尾的搜索库的搜索目录字符串的字符串表偏移量。 ----->注意

+图四

[wujian@redhat72 elf_door]$ readelf -d 。/pinG

Dynamic segment at offset 0x5618 contains 22 entries:

Tag Type Name/Value

0x00000001 (NEEDED) Shared library: [libresolv。so。2]

0x00000001 (NEEDED) Shared library: [libc。so。6]

0x0000000c (INIT) 0x8048a7c

0x0000000d (FINI) 0x804bfb0

0x00000004 (HASH) 0x8048128

0x00000005 (STRTAB) 0x8048610

0x00000006 (SYMTAB) 0x80482a0

0x0000000a (STRSZ) 541 (bytes)

0x0000000b (SYMENT) 16 (bytes)

0x00000015 (DEBUG) 0x0

0x00000003 (PLTGOT) 0x804e554

0x00000002 (PLTRELSZ) 360 (bytes)

0x00000014 (PLTREL) REL

0x00000017 (JMPREL) 0x8048914

0x00000011 (REL) 0x80488e4

0x00000012 (RELSZ) 48 (bytes)

0x00000013 (RELENT) 8 (bytes)

0x6ffffffe (VERNEED) 0x80488b4

0x6fffffff (VERNEEDNUM) 1

0x6ffffff0 (VERSYM) 0x8048844

0x0000000f (RPATH) Library rpath: [_wujianqiang:]

0x00000000 (NULL) 0x0

从上面看到DT_STRTAB联合d_un中的v_ptr指向的是[5]。dynstr节

。plt 的概念在这里不再阐述。注意JMPREL,PLTGOT。

通过上面的一些介绍,我们进入正式的话题,首先我们要解决的是修改"__gmon_start__"为"_wujianqiang:\0"或者"xxx:\0"类似的东西,实际":\0"就行了。以NULL结尾就ok了。

问题为啥修改__gmon_start__这个符号?

下面我们先看一个正常的关于__gmon_start__的输出

[wujian@redhat72 elf_door]$ readelf -a 。/elf

[。。。]

Relocation section '。rel。dyn' at offset 0x478 contains 2 entries:

Offset Info Type Symbol's Value Symbol's Name

0804a2e4 01506 R_386_GLOB_DAT 00000000 __gmon_start__

 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<



上一篇:Linux系统调用的执行过程是怎么样的?   下一篇:Linux系统中实现内部进程通信的方法

文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
更多相关文章
Power by linux-cn.com 粤ICP备05006655号