仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 725|回复: 12
打印 上一主题 下一主题

[其他Linux] 带来一篇Linux中使用初级埋没手艺先容

[复制链接]
金色的骷髅 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 11:19:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
每一个开发团队都对他的发行版做过测试后放出的.那些国际知名的大品牌更是如此。
<divclass="start">本文深切剖析了Linux情况下文件、历程及模块的初级埋没手艺,个中包含:Linux可卸载模块编程手艺、修正内存映象间接对体系挪用举行修正手艺,经由过程假造文件体系proc埋没特定历程的手艺。
  埋没手艺在盘算机体系平安中使用非常普遍,特别是在收集打击中,当打击者乐成侵进一个体系后,无效埋没打击者的文件、历程及其加载的模块变得尤其主要。本文将会商Linux体系中文件、历程及模块的初级埋没手艺,这些手艺有的已被普遍使用到各类后门或平安检测程序当中,而有一些则方才起步,仍旧处在会商阶段,使用很少。
  1.埋没手艺
  1.1.Linux下的中止把持及体系挪用
  Intelx86系列微机撑持256种中止,为了使处置器对照简单地辨认每种中止源,把它们从0~256编号,即付与一其中断范例码n,Intel把它称作中止向量。
  Linux用一其中断向量(128大概0x80)来完成体系挪用,一切的体系挪用都经由过程独一的出口system_call来进进内核,当用户静态历程实行一条int0x80汇编指令时,CPU就切换到内核态,并入手下手实行system_call函数,system_call函数再经由过程体系挪用表sys_call_table来获得响应体系挪用的地点举行实行。体系挪用表sys_call_table中寄存一切体系挪用函数的地点,每一个地点能够用体系挪用号来举行索引,比方sys_call_table[NR_fork]索引到的就是体系挪用sys_fork()的地点。
  Linux用中止形貌符(8字节)来暗示每一个中止的相干信息,其格局以下:
  偏移量31….16  一些标记、范例码及保存位
  段选择符      偏移量15….0
  一切的中止形貌符寄存在一片一连的地点空间中,这个一连的地点空间称作中止形貌符表(IDT),其肇端地点寄存在中止形貌符表存放器(IDTR)中,其格局以下:
  32位基址值  界线
  个中各个布局的响应接洽能够以下暗示:
  经由过程下面的申明能够得出经由过程IDTR存放器来找到system_call函数地点的办法:依据IDTR存放器找到中止形貌符表,中止形貌符表的第0x80项便是system_call函数的地点,这个地点将在前面的会商中使用到。
  1.2.Linux的LKM(可装载内核模块)手艺
  为了使内核坚持较小的体积并可以便利的举行功效扩大,Linux体系供应了模块机制。模块是内核的一部分,但并没有被编译进内核,它们被编译成方针文件,在运转过程当中依据必要静态的拔出内核大概从内核中移除。因为模块在拔出后是作为Linux内核的一部分来运转的,以是模块编程实践上就是内核编程,因而能够在模块中利用一些由内核导出的资本,比方Linux2.4.18版之前的内核导出体系挪用表(sys_call_table)的地点,如许就能够依据该地点间接修正体系挪用的出口,从而改动体系挪用。在模块编程中必需存在初始化函数及扫除函数,一样平常情形下,这两个函数默许为init_module()和clearup_module(),从2.3.13内核版本入手下手,用户也能够给这两个函数从头定名,初始化函数在模块被拔出体系时挪用,在个中能够举行一些函数及标记的注册事情,扫除函数则在模块移除体系时举行挪用,一些恢停工作一般在该函数中完成。
  1.3.Linux下的内存映像
  /dev/kmem是一个字符设备,是盘算机主存的映像,经由过程它能够测试乃至修正体系,当内核不导出sys_call_table地点大概不同意拔出模块时能够经由过程该映像修正体系挪用,从而完成埋没文件、历程大概模块的目标。
  1.4.proc文件体系
  proc文件体系是一个假造的文件体系,它经由过程文件体系的接话柄现,用于输入体系运转形态。它以文件体系的情势,为操纵体系自己和使用历程之间的通讯供应了一个界面,使使用程序可以平安、便利地取得体系以后的运转情况何内核的外部数据信息,并能够修正某些体系的设置信息。因为proc以文件体系的接话柄现,因而能够象会见一般文件一样会见它,但它只存在于内存当中。
  2.手艺剖析
  2.1埋没文件
  Linux体系顶用来查询文件信息的体系挪用是sys_getdents,这一点能够经由过程strace来察看到,比方stracels将列出命令ls用到的体系挪用,从中能够发明ls是经由过程sys_getedents来实行操纵的。当查询文件大概目次的相干信息时,Linux体系用sys_getedents来实行响应的查询操纵,并把失掉的信息传送给用户空间运转的程序,以是假如修正该体系挪用,往失落了局中与某些特定文件的相干信息,那末一切使用该体系挪用的程序将看不见该文件,从而到达了埋没的目标。起首先容一下本来的体系挪用,其原型为:
  intsys_getdents(unsignedintfd,structdirent*dirp,unsignedintcount)
  个中fd为指向目次文件的文件形貌符,该函数依据fd所指向的目次文件读取响应dirent布局,并放进dirp中,个中count为dirp中前往的数据量,准确时该函数前往值为添补到dirp的字节数。下图是修正后的体系挪用hacked_getdents实行流程。
  hacked_getdents函数实践上就是先挪用本来的体系挪用,然后从失掉的dirent布局中往除与特定文件名相干的文件信息,从而使用程序从该体系挪用前往后将看不到该文件的存在。
  应当注重的是,一些较新的版本中是经由过程sys_getdents64来查询文件信息的,但实在现道理与sys_getdents基础不异,以是在这些版本中仍旧能够用与下面相似的办法来修正该体系挪用,埋没文件。
  2.2 埋没模块
  下面剖析了怎样修正体系挪用以埋没特命名字的文件,在实践的处置中,常常会用模块来到达修正体系挪用的目标,可是当拔出一个模块时,若不接纳任何埋没措施,很简单被对方发明,一旦对方发明并卸载了所拔出的模块,那末一切使用该模块来埋没的文件就表露了,以是应持续剖析怎样来埋没特命名字的模块。Linux顶用来查询模块信息的体系挪用是sys_query_module,以是能够经由过程修正该体系挪用到达埋没特定模块的目标。起首注释一下本来的体系挪用,本来体系挪用的原型为:
  intsys_query_module(constchar*name,intwhich,void*buf,size_tbufsize,size_t*ret)
金色的骷髅 该用户已被删除
沙发
 楼主| 发表于 2015-1-16 12:39:10 | 只看该作者

带来一篇Linux中使用初级埋没手艺先容

虽然Linux桌面应用发展很快,但是命令在Linux中依然有很强的生命力。Linux是一个命令行组成的操作系统,精髓在命令行。
>  假如参数name不空,则会见特定的模块,不然会见的是内核模块,参数which申明查询的范例,当which=QM_MODULES时,前往一切以后已拔出的模块称号,存进buff,而且在ret中寄存模块的个数,buffsize是buf缓冲区的巨细。在模块埋没的过程当中只必要对which=QM_MODULES的情形举行处置就能够到达目标。修正后的体系挪用事情历程以下:</P>  1)挪用本来的体系挪用,堕落则前往毛病代码;
  2)假如which不即是QM_MODULES,则不必要处置,间接前往。
  3)从buf的入手下手地位举行处置,假如存在特定的名字,则将前面的模块称号向前掩盖该名字。
  4)反复3),直各处理处置完一切的名字,准确前往。
  2.3埋没历程
  在Linux中不存在间接查询历程信息的体系挪用,相似于ps如许查询历程信息的命令是经由过程查询proc文件体系来完成的,在背景常识中已先容过proc文件体系,因为它使用文件体系的接话柄现,因而一样能够用埋没文件的办法来埋没proc文件体系中的文件,只必要在下面的hacked_getdents中到场关于proc文件体系的判别便可。因为proc是特别的文件体系,只存在于内存当中,不存在于任何实践设备之上,以是Linux内核分派给它一个特定的主设备号0和一个特定的次设备号1,除此以外,因为在外存上没有与之对应的i节点,以是体系也分派给它一个特别的节点号PROC_ROOT_INO(值为1),而设备上的1号索引节点是保存不必的。经由过程下面的剖析,能够得出判别一个文件是不是属于proc文件体系的办法:
  1)失掉该文件对应的inode布局dinode;
  2)if(dinode->i_ino==PROC_ROOT_INO&&!MAJOR(dinode->i_dev)&&MINOR(dinode->i_dev)==1){该文件属于proc文件体系}
  经由过程下面的剖析,给出埋没特定历程的伪代码暗示:
  hacket_getdents(unsignedintfd,structdirent*dirp,unsignedintcount)
  {
  挪用本来的体系挪用;
  失掉fd所对应的节点;
  if(该文件属于proc文件体系&&该文件名必要埋没)
  {从dirp中往失落该文件相干信息}
  }

  2.4 修正体系挪用的办法
  如今已办理了怎样修正体系挪用来到达埋没的目标,那末怎样用修正后的体系挪用来交换本来的呢?这个成绩在实践使用中常常是最关头的,上面将会商在分歧的情形下怎样做到这一点。
  (1)当体系导出sys_call_table,而且撑持静态的拔出模块的情形下:
  在Linux内核2.4.18版之前,这类内核设置长短常广泛的。这类情形下修正体系挪用十分简单,只必要修正响应的sys_call_table表项,使其指向新的体系挪用便可。上面是响应的代码:
  intorig_getdents(unsignedintfd,structdirent*dirp,unsignedintcount)
   intinit_module(void) 
    /*初始化模块*/
    {
    orig_getdents=sys_call_table[SYS_getdents];    //保留本来的体系挪用
    orig_query_module=sys_call_table[SYS_query_module]
    sys_call_table[SYS_getdents]=hacked_getdents;  //设置新的体系挪用
    sys_call_table[SYS_query_module]=hacked_query_module;
    return0;//前往0暗示乐成
    }
    voidcleanup_module(void)
    /*卸载模块*/
    {
    sys_call_table[SYS_getdents]=orig_getdents;    //恢回复来的体系挪用
    sys_call_table[SYS_query_module]=orig_query_module;
    }
  (2)在体系其实不导出sys_call_table的情形下:
  linux内核在2.4.18今后为了平安起见不再导出sys_call_table标记,从而没法间接取得体系挪用表的地点,那末就必需找到其他的举措来失掉这个地点。在背景常识中提到了/dev/kmem是体系主存的映像,能够经由过程查询该文件来找到sys_call_table的地点,并对其举行修正,来利用新的体系挪用。那末怎样在体系映像中找到sys_call_table的地点呢?让我们先看看system_call的源代码是怎样来完成体系挪用的(代码见/arch/i386/kernel/entry.S):
  ENTRY(system_call)
    pushl%eax      #saveorig_eax
    SAVE_ALL
    GET_CURRENT(%ebx)
    cmpl$(NR_syscalls),%eax
    jaebadsys
    testb{GetProperty(Content)}x02,tsk_ptrace(%ebx)  #PT_TRACESYS
    jnetracesys
    call*SYMBOL_NAME(sys_call_table)(,%eax,4)
    movl%eax,EAX(%esp)    #savethereturnvalue
  ENTRY(ret_from_sys_call)
  这段源代码起首保留响应的存放器的值,然后判别体系挪用号(在eax寄
上一页123下一页


为什么我使用一个命令的时候,系统告诉我找不到该目录,我要如何限制使用者的权限等问题,这些问题其实都不是很难的。
金色的骷髅 该用户已被删除
板凳
 楼主| 发表于 2015-1-16 12:45:42 | 只看该作者

带来一篇Linux中使用初级埋没手艺先容

如果你只是想应付一下操作系统的课程,劝你最好别学,或者说不要指望能用的怎么样。
存器中)是不是正当,继而对设置调试的情形举行处置,在一切这些举行完后,使用call*SYMBOL_NAME(sys_call_table)(,%eax,4)来转进响应的体系挪用举行处置,个中的SYMBOL_NAME(sys_call_table)得出的就是sys_call_table的地点。从下面的剖析能够看出,当找到system_call函数以后,使用字符婚配来寻觅响应call语句就能够断定sys_call_table的地位,由于callsomething(,%eax,4)的呆板指令码是0xff0x140x85。以是婚配这个指令码就好了。至于怎样断定system_call的地点在背景常识中已先容了,上面给出响应的伪代码:</P>  struct{//各字段寄义能够参考背景常识中关于IDTR存放器的先容
    unsignedshortlimit;
    unsignedintbase;
    }__attribute__((packed))idtr;
    struct{ //各字段寄义能够参考背景常识中关于中止形貌符的先容
    unsignedshortoff1;
    unsignedshortsel;
    unsignedcharnone,flags;
    unsignedshortoff2;
    }__attribute__((packed))idt;
    intkmem;
    /*上面函数用于从kemem对应的文件中偏移量为off处读取sz个字节至内存m处*/
    voidreadkmem(void*m,unsignedoff,intsz){………}
    /*上面函数用于从src读取count个字节至dest处*/
    voidweitekmem(void*src,void*dest,unsignedintcount){………..}
    unsignedsct;  //用来寄存sys_call_table地点
    charbuff[100];//用于寄存system_call函数的前100个字节。
    char*p;
    if((kmem=open(“/dev/kmem”,O_RDONLY))<0)
    return1;
    asm(“sidt%0”“:=m”(idtr));       //读取idtr存放器的值至idtr布局中
    readkmem(&idt,idtr.base+8*0x80,sizeof(idt))    //将0x80形貌符读至idt布局中
    sys_call_off=(idt.off2<<16) idt.off1;      //失掉system_call函数的地点。
    readkmem(buff,sys_call_off,100)   //读取system_call函数的前100字节至buff
    p=(char*)memmem(buff,100,”xffx14x85”,3);  //失掉call语句对应呆板码的地点
    sct=(unsigned*)(p+3)            //失掉sys_call_table的地点。
  至此已失掉了sys_call_table在内存中的地位,如许在依据体系挪用号就可以够找到响应的体系挪用对应的地点,修正该地点就能够利用新的体系调函数,详细的做法以下:
  readkmem(&orig_getdents,sct+SYS_getdents*4,4)//保留本来的体系挪用
    readkmem(&orig_query_module,sct+SYS_query_module*4,4);
    writekmem(hacked_getdents,sct+SYS_getdents*4,4);//设置新的体系挪用
    writekmem(hacket_query_module,sct+SYS_query_module*4,4);
  2.5 其他的相干手艺
  下面已完整办理了埋没的相干手艺成绩,在实践使用中,能够把启动模块大概历程的代码做成剧本到场到响应的启动目次中,假定你的Linux运转级别为3,则能够加到目次rc3.d中(该目次常存在于/etc/rc.d大概/etc目次下),然后把该剧本的名字改成能够埋没的名字。另外一种办法就是在一些启动剧本中到场启动你的模块大概历程的代码,但如许对照简单被发明,一个办理思绪就是历程或模块启动今后即刻恢复一般的剧本,因为体系关机时会向一切历程发送SIGHUP旌旗灯号,能够在历程或模块中处置该旌旗灯号,使该旌旗灯号产生时修正启动剧本,从头到场启动模块的代码,如许当体系下次启动时又能够加载这个的模块了,并且办理员观察启动剧本时也不会发明非常。
  3.停止语
  本文对Linux情况下的一些初级埋没手艺举行了剖析研讨,个中所触及的手艺不但能够用在体系平安方面,在其他方面也有主要的自创意义。因为Linux的开放特征,使得打击者一旦取得了root权限就可以够对体系举行较多的修正,以是制止第一次被进侵是相当主要的
</p>
上一页123


按照它们在系统中的作用分成几个部分介绍给大家,通过这些基础命令的学习我们可以进一步理解Linux系统:
不帅 该用户已被删除
地板
发表于 2015-1-18 16:06:00 | 只看该作者
Linux的成功就在于用最少的资源最短的时间实现了所有功能,这也是符合人类进化的,相信以后节能问题会日益突出。
莫相离 该用户已被删除
5#
发表于 2015-1-27 10:51:11 | 只看该作者
安装一个新的软件时先看README,再看INSTALL然后看FAQ,最后才动手安装,这样遇到问题就知道为什么。如果Linux说明文档不看,结果出了问题再去论坛来找答案反而浪费时间。
愤怒的大鸟 该用户已被删除
6#
发表于 2015-2-5 12:40:37 | 只看该作者
有疑问前,知识学习前,先用搜索。
第二个灵魂 该用户已被删除
7#
发表于 2015-2-11 21:56:44 | 只看该作者
熟悉系统的基本操作,Linux的图形界面直观,操作简便,多加上机练习就可熟悉操作,在Linux下学习办公软件等常用软件。
分手快乐 该用户已被删除
8#
发表于 2015-3-2 21:00:55 | 只看该作者
尽我能力帮助他人,在帮助他人的同时你会深刻巩固知识。
谁可相欹 该用户已被删除
9#
发表于 2015-3-11 06:33:24 | 只看该作者
这也正是有别的OS得以存在的原因,每个系统都有其自身的优点。?
若天明 该用户已被删除
10#
发表于 2015-3-18 00:19:09 | 只看该作者
其次,Linux简单易学,因为我们初学者只是学的基础部分,Linux的结构体系非常清晰,再加上老师循序渐进的教学以及耐心的讲解,使我们理解起来很快,短期内就基本掌握了操作和运行模式。
变相怪杰 该用户已被删除
11#
发表于 2015-3-25 09:31:32 | 只看该作者
直到学习Linux这门课以后,我才知道,原来我错了。?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-9-22 22:23

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表