Chinaunix

标题: 怎样防止系统reboot [打印本页]

作者: wsgtrsys    时间: 2006-04-04 22:41
标题: 怎样防止系统reboot
有一个程序,如果没注册将会每24小时reboot系统,有什么样的办法可以让他的reboot失效?
我试过用替换库函数的办法,结果没有成功。难道必须要改系统调用 ?
作者: donkey    时间: 2006-04-05 00:33
mv reboot ...
作者: wolf0403    时间: 2006-04-05 00:42
有够彪悍的程序。。。用非 root 用户执行它就可以让它无法 reboot 了。
作者: wsgtrsys    时间: 2006-04-05 10:27
楼上的办法不行。
如果它在程序中直接使用系统调用的reboot功能,还有什么办法吗?
作者: mq110    时间: 2006-04-05 12:52
2.6内核的话. 要自己导出syscall_table 然后替换掉reboot系统调用.就不能reboot了.
作者: mq110    时间: 2006-04-05 12:53
http://bbs.chinaunix.net/viewthread.php?tid=713899

看看这个帖子.我发的代码.
作者: wsgtrsys    时间: 2006-04-05 17:11
谢谢
作者: wolf0403    时间: 2006-04-06 13:28
360 /*
361  * Reboot system call: for obvious reasons only root may call it,
362  * and even root needs to set up some magic numbers in the registers
363  * so that some mistake won't make this reboot the whole machine.
364  * You can also set the meaning of the ctrl-alt-del-key here.
365  *
366  * reboot doesn't sync: do that yourself before calling this.
367  */
368 asmlinkage long sys_reboot(int magic1, int magic2, unsigned int cmd, void __user * arg)
369 {
370         char buffer[256];
371
372         /* We only trust the superuser with rebooting the system. */
373         if (!capable(CAP_SYS_BOOT))
374                 return -EPERM;


我不知道你在反对我的说法之前能不能仔细考察一下。
作者: wsgtrsys    时间: 2006-04-19 08:50
我已经替换掉了sys_reboot,执行reboot后它不可以重启了。
可是仍然有一个问题。
在重启前它会kill所有的进程,然后执行reboot系统调用。

现在虽然不能重启,可是所有的进程都被 杀死了,不能重 启有什么意义?还有什么办法能阻止它kill所有进程?
或者还是用替换函数?
作者: ukyo502    时间: 2006-04-19 09:50
这程序也太强了....
作者: wingger    时间: 2006-04-19 09:51
这种人就活该没人理。
自己一个劲儿瞎折腾,别人帮你还不懂得配合。
用非 root 身份的用户就可以了。除非这个程序没有 root 就不能运行,那又自当别论。
再者,用 ltrace 跟一下,就知道它是怎么使系统重启的了,如果只是用简单地 system( "reboot" ) 一类的办法的话,就 N 多的对策。
作者: wsgtrsys    时间: 2006-04-19 11:42
原帖由 wingger 于 2006-4-19 09:51 发表
这种人就活该没人理。
自己一个劲儿瞎折腾,别人帮你还不懂得配合。
用非 root 身份的用户就可以了。除非这个程序没有 root 就不能运行,那又自当别论。
再者,用 ltrace 跟一下,就知道它是怎么使系统重启的了 ...


1、这个程序不能以非root用户运行。
2、没有ltrace、gdb这些命令,也没有标准的shell环境。因为它是一个裁减的linux系统。
3、它的reboot是通过调用init 6来实现的。init在执行reboot前会通过内核向系统中的所有进程发送退出信号。
3、这个程序是系统中其它各重要功能程序的母进程,其它进程通过socks和这个母进程通信,同时每一个程序都有自校验。
作者: wingger    时间: 2006-04-19 13:55
原帖由 wsgtrsys 于 2006-4-19 11:42 发表

它的reboot是通过调用init 6来实现的。

哈哈,那就再好不过了。
你把 init 4 当作 init 6 来用不就行了?
按照 System V init 的标准,init 4 是保留给用户自定义用的。
你把 init 6 去掉,init 4 弄成 reboot,不就行了?
作者: wingger    时间: 2006-04-19 13:57
再说一遍,如果你搞不清楚那个程序是如何使系统 reboot 的,只需要 ltrace 一下就知道了。
至于你的系统没装 ltrace,呵呵,那就装一个呀!用完了再删掉。
作者: wsgtrsys    时间: 2006-04-19 14:43
原帖由 wingger 于 2006-4-19 13:57 发表
再说一遍,如果你搞不清楚那个程序是如何使系统 reboot 的,只需要 ltrace 一下就知道了。
至于你的系统没装 ltrace,呵呵,那就装一个呀!用完了再删掉。



没这么容易的。至少我觉得是这样。
如果如你说的那样简单的话,你可以试一下。

程序可以这里下载到:
http://www.mikrotik.com/download.html

它的程序做得比较BT。很多时候它不是直接调用库函数。而是自己做一个库,先用自己的程序调用自己的库,再用库调用标准的libc库。

/bin/bash: ./stoper: not found
\h:\w\$ ./stopper
connect failed (errno=111)
\h:\w\$ strace ./stopper
execve("./stopper", ["./stopper"], [/* 17 vars */]) = 0
uname({sys="Linux", node="debian", ...}) = 0
brk(0)                                  = 0x804a510
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=1208, ...}) = 0
old_mmap(NULL, 1208, PROT_READ, MAP_PRIVATE, 3, 0) = 0x40017000
close(3)                                = 0
open("/lib/libumsg.so", O_RDONLY)       = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0000\257"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=127780, ...}) = 0
old_mmap(NULL, 140204, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x40018000
old_mmap(0x40037000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1e000) = 0x40037000
old_mmap(0x40038000, 9132, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x40038000
close(3)                                = 0
open("/lib/libuxml++.so", O_RDONLY)     = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0P\31\0\000"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=12952, ...}) = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x4003b000
old_mmap(NULL, 15712, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x4003c000
old_mmap(0x4003f000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x4003f000
close(3)                                = 0
open("/lib/libuc++.so", O_RDONLY)       = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\20V\0\000"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=49932, ...}) = 0
old_mmap(NULL, 52132, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x40040000
old_mmap(0x4004c000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xb000) = 0x4004c000
close(3)                                = 0
open("/lib/libc.so.6", O_RDONLY)        = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\320T\1"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=1144316, ...}) = 0
old_mmap(NULL, 1150036, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x4004d000
old_mmap(0x40160000, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x113000) = 0x40160000
old_mmap(0x40164000, 7252, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x40164000
close(3)                                = 0
mprotect(0x40160000, 4096, PROT_READ)   = 0
munmap(0x40017000, 120                = 0
brk(0)                                  = 0x804a510
brk(0x806b510)                          = 0x806b510
brk(0x806c000)                          = 0x806c000
rt_sigaction(SIGSEGV, {0x4002ab76, [], SA_RESTORER|SA_RESTART|SA_SIGINFO, 0x40075660}, NULL, = 0
rt_sigaction(SIGILL, {0x4002ab76, [], SA_RESTORER|SA_RESTART|SA_SIGINFO, 0x40075660}, NULL, = 0
rt_sigaction(SIGBUS, {0x4002ab76, [], SA_RESTORER|SA_RESTART|SA_SIGINFO, 0x40075660}, NULL, = 0
rt_sigaction(SIGFPE, {0x4002ab76, [], SA_RESTORER|SA_RESTART|SA_SIGINFO, 0x40075660}, NULL, = 0
getsockname(3, 0xbffffabc, [110])       = -1 EBADF (Bad file descriptor)
socket(PF_FILE, SOCK_STREAM, 0)         = 3
connect(3, {sa_family=AF_FILE, path="/tmp/novasock"}, 110) = -1 ECONNREFUSED (Connection refused)
write(2, "connect failed (errno=111)\n", 27connect failed (errno=111)
) = 27
close(3)                                = 0
exit_group(1)                           = ?

作者: wsgtrsys    时间: 2006-04-19 14:45
而且目前还不知道是系统中的哪一个进程调用了reboot.我试着在gdb中,对SIGALRM信号设断点,根本断不到。
作者: wingger    时间: 2006-04-19 15:09
原帖由 wsgtrsys 于 2006-4-19 14:43 发表



没这么容易的。至少我觉得是这样。
如果如你说的那样简单的话,你可以试一下。

晕~
知道你就是个较劲的主,
我没试过敢跟你胡说?
我的系统 init 0 3 6 的每一个动作,我都能控制。
想让它重启它就重启,不想让它重启它就重启不了,
linux + gnu tools 都是开源的,有什么事情做不了?
作者: wsgtrsys    时间: 2006-04-19 15:15
原帖由 wingger 于 2006-4-19 15:09 发表

晕~
知道你就是个较劲的主,
我没试过敢跟你胡说?
我的系统 init 0 3 6 的每一个动作,我都能控制。
想让它重启它就重启,不想让它重启它就重启不了,
linux + gnu tools 都是开源的,有什么事情做不了?



它的init 是修改过,getty login全部是修改过的。要动它确实麻烦。你安装试一下就知道了。
而且没有使用inittab表

[ 本帖最后由 wsgtrsys 于 2006-4-19 15:16 编辑 ]
作者: wingger    时间: 2006-04-19 15:22
原帖由 wsgtrsys 于 2006-4-19 15:15 发表



它的init 是修改过,getty login全部是修改过的。要动它确实麻烦。你安装试一下就知道了。
而且没有使用inittab表

你不是说只是“一个程序”吗?
什么时候连 init 都改了?
呵呵,我大概浏览了一下网页,再听你这么一说,看来人家那是一个完整的可运行的操作系统,
那么就是个斗智斗力的活了,
呵呵,看得出来,你这个东西不是做着玩儿的,如果感兴趣的话,和我站内短信联系,我先看看,做不做就看你是什么态度了。
作者: redor    时间: 2006-04-19 17:53
把内核重新编译一下。。。。
作者: wolf0403    时间: 2006-04-19 18:08
重新编译内核没 P 用。。。如果改动的不是一个程序,那么就如 wingger 所说,
那么就是个斗智斗力的活了,

作者: 我菜我怕谁    时间: 2006-05-08 20:39





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2