欢迎光临极品网,更多、更新的资源信息尽在Jpinw.Com!本站所有信息资源每日更新新的内容,请大家继续关注www.Jpinw.com!如果觉得本站还不错,对您有帮助,别忘了向您的朋友推荐本站!请记好本站网址:http://www.Jpinw.com,网站发展靠大家多多的支持!!!

极品网 极品课件 极品论文 极品文学 极品游戏 极品美容 极品手机资源 极品股票

#
免费资源: 免费域名 | 免费空间 | 免费推广 | 免费邮箱 | 免费硬盘 | 免费论坛 | 免费留言 | 免费统计 | 在线投稿 | 更多...
电脑学院: 操作系统 | 安全相关 | 网页设计 | 编程开发 | 建站经验 | 服务器类 | 黑客攻防 | 菜鸟入门 | 教你网赚 | 更多...
文章导航: 网赚学堂 | 网赚秘笈 | 网赚三维 | 网赚先锋 | 网赚资讯 | 感悟网赚 | 众生百态 | 经典美文 | 范文中心 | 更多...
图酷天下: 时事图酷 | 娱乐图酷 | 搞笑图酷 | 时尚图酷 | 体育图酷 | 另类经典 | 论文资源 | 课件下载 | 文学知识 | 更多...

您现在的位置: 极品网 >> 电脑学院 >> 黑客攻防 >> 黑客编程 >> 教程正文

LIUNX下解析Elf文件DT_RPATH后门 一          【字体:
LIUNX下解析Elf文件DT_RPATH后门 一
作者:佚名    教程来源:不详    点击数:    更新时间:2006-5-29    

 








LIUNX下解析Elf文件DT_RPATH后门

一.前言
二.分析
三.结论
四.实现
五.参考
一.前言
    前一段时间回顾elf文件方面的知识时,翻了以前很多优秀的文章,在xfocus的帮助文件unix版中看到了alert7大侠
<<ELF后门之DT_RPATH篇>> 这篇文章,看了一下时间9月/14号,那段时间忙着重修,没到网吧去。alert7没有贴代码,我想还是有人不了解,就把这篇文章写出来给大家整理性的介绍一下,这里指的是linux下。
    这篇文章不是介绍elf基础的文章,所以一些概念性的东西请参考elf鉴别,然后拿起你的gdb实际去了解一下啥叫got,
plt,重定向的概念,了解一下动态连接和静态连接,用readelf或者objdump实际看一下,后面的参考中可以找到你需要的。
文中错误再所难免,欢迎指正;)
二.分析
后门存在的原因:
———————————————————————————————————
引自<<ELF后门之DT_RPATH篇>>
*动态数组标记DT_RPATH保存着目录列表的字符串(用冒号(:)分隔)。
例如,字符串/home/dir/lib:/home/dir2/lib:告诉动态连接器先搜索
/home/dir/lib,再搜索/home/dir2/lib,再是当前目录。
LD_LIBRARY_PATH环境变量设置的目录在DT_RPATH指向的目录之后被搜索。
而且出于安全考虑,动态连接器忽略set-user和set-group的程序的
LD_LIBRARY_PATH所指定的搜索目录。但它会搜索DT_RPATH指明的目录和
/usr/lib。所以这个DT_RPATH还是比较感兴趣的。
有了以上的基本知识,我们可以在一个set-user的程序上安装一个DT_RPATH入口(一般程序都没有)。
让其搜索路径首先为当前目录。把我们自己编写的库以其名字放到当前目录下,更让其加栽我们自己的动态库。
这样我们就可以得到set-user的权限了。

截获了__libc_start_main,肯定能确保ping 程序放弃特权之前执行。(假如截获malloc之类的就不能确保了)。
因为我们用到了一些libc.so.6中的函数,所以我们需要把我们自己的LIB以libresolv.so.2的名字存放在当前目录下。


———————————————————————————————

由此实现这个后门的关键在于:

a:修改或添加(通常是不存在的)在.dynamic节中(数组)d_tag为DT_RPATH的入口结构(entry)d_un.d_val指向为到
.dynstr节的的一个以**NULL结尾字符串的偏移量(如果存在DT_RATH的话).此字符串是路径的集合,其中路径以:分开。
最后一个:后面表示当前目录,如果前面的字符串改成这样的"_wujianqiang:\0"(这样用来表示一个NULL;))表明现在当前
目录下的_wujianqiang子目录中寻找,然后再在当前目录下寻找,显然这里采用的相对目录,我们主要是构造这个字符串,同时
我们要想到,我们是添加一个这样的字符串还是修改某个字符串成为我们需要的形式,显然前者就比较复杂,就要使program header ,
section 的某些成员都要改变,所以我们采用修改的方法,找一个动态符号修改,这里我选用了__gmon_start__这个字符串。
当然其它的也可以,不过发现__gmon_start__有点特殊,并且几乎所有的程序里都有这个符号,所以我就选了这个。
  通常d_tag为DT_RPATH的入口结构不存在,所以我们要添加这个DT_RPATH,实际上.dynamic数组中应该有几个空的没用的这样
的NULL入口,(一般都可以找到)所以我在程序中找的是第一个NULL入口,没有采用修改某些入口的方法。同样的这里我们不需要修改任
何section,program header 的某些结构成员,因为这里有并且存在entry结构,我们不用添加只要修改。至此我们的elf文件修
改任务结束。

b.现在我们只需要做的就是截获那个函数的问题,alert7提出了截获__libc_start_main这个函数,我们就来截获这个函数
但是为啥“能够“截获这个函数的原因我们在后面讲述。

我们先解决问题a:
下面是相关知识
    通常来说每一个动态连接的object它的程序头表将有一个类型为PT_DYNAMIC的元素。该“段”包含了.dynamic section。
每个入口(entry)的结构如下:
+ 图一. Dynamic Structure
typedef struct
{
  Elf32_Sword   d_tag;                  /* Dynamic entry type */
  union
    {
      Elf32_Word d_val;                 /* Integer value */
      Elf32_Addr d_ptr;                 /* Address value */
    } d_un;
} Elf32_Dyn;
下面用readelf解释一下
+图二
[wujian@redhat72 elf_door]$ readelf -l ./pinG
Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  [....]
  DYNAMIC        0x005618 0x0804e618 0x0804e618 0x000d0 0x000d0 RW  0x4

Section to Segment mapping:
  Segment Sections...
  [....]
  04     dynamic
[wujian@redhat72 elf_door]$ readelf -S ./pinG
There are 24 section headers, starting at offset 0x57cc:

Section Headers: 其中省略部分
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 4] .dynsym           DYNSYM          080482a0 0002a0 000370 10   A  5   1  4
  [ 5] .dynstr           STRTAB          08048610 000610 000233 00   A  0   0  1
  [ 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__

Symbol table '.dynsym' contains 22 entries:
Num:    Value  Size Type    Bind   Vis      Ndx Name
[...]
97: 00000000     0 NOTYPE  WEAK   DEFAULT  UND __gmon_start__


Name            Value  Field   Calculation
  ====            =====    =====  ===========
  R_386_GLOB_DAT     6    word32  S               通常我们看到的是R_386_JMP_SLOT这种类型的

R_386_GLOB_DAT This relocation type is used to set a global offset table entry to the address
of the specified symbol. The special relocation type allows one to determine
the correspondence between symbols and global offset table entries.

* R_386_GLOB_DAT

  这种重定位类型用于设置一个全局偏移表入口为指定符号的地址。该特定的重定位 (alert7大侠译)
  类型允许你决定符号和全局偏移表入口之间的一致性。

S This means the value of the symbol whose index resides in the relocation entry.

* S

  表示索引驻留在重定位入口处的符号值。

[19] .got              PROGBITS        0804a290 001290 000058 04  WA  0   0  4
[20] .dynamic          DYNAMIC         0804a2e8 0012e8 0000c8 08  WA  5   0  4
offset=0804a2e4
实际上这个重定位标示的偏移是got节的最后一个入口,并设置这个入口的值为__gmon_start__的这个符号的地址。

下面做一个小测试实际看一下:
/*test.c*/
int __gmon_start__(){return 0;}
int main(){return __gmon_start__();}
EOF
[wujian@redhat72 elf_door]$ readelf -a test
Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [..]
  [ 8] .rel.dyn          REL             08048294 000294 000008 08   A  4   0  4
  [ 9] .rel.plt          REL             0804829c 00029c 000020 08   A  4   b  4
  [..]
  [12] .text             PROGBITS        08048330 000330 000160 00  AX  0   0 16
  [19] .got              PROGBITS        080494dc 0004dc 000020 04  WA  0   0  4
  [20] .dynamic          DYNAMIC         080494fc 0004fc 0000c8 08  WA  5   0  4
----------------------------------------------------------------
Relocation section '.rel.dyn' at offset 0x294 contains 1 entries:
Offset    Info  Type            Symbol's Value  Symbol's Name
080494f8  00606 R_386_GLOB_DAT        08048430  __gmon_start__ offset=0x080494f8实际是got的最后一个入口偏移
----------------------------------------------------------------

  

 

教程录入:dping    责任编辑:dping 
  • 上一篇教程:

  • 下一篇教程:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关教程
    Trojan-PSW.Win32.OnLineGam
    Trojan.OlineGames.es是什么
    我下了几个LINUX的安装包,请
    我在运行taango时总弹出 NO 
    Trojan-PSW.Win32.OnlineGam
    退出游戏时弹出Error: Cant 
    linux问题与win 2000共存
    Perflib_Perfdata_c0.dat
    杀毒后无法上网 只能看PPLIV
    Win32.Liveu.a.238是什么病毒
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    极品网
    | 设为首页 | 加入收藏 | 友情链接 | 版权声明 |
    极品网

    Copyright 2006 Jpinw.com 极品网

    备案号:申请中

    极品网