亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問(wèn)板塊 發(fā)新帖
查看: 788 | 回復(fù): 0
打印 上一主題 下一主題

FC6增加系統(tǒng)調(diào)用 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2007-08-16 19:09 |只看該作者 |倒序?yàn)g覽
系統(tǒng):32位x86系統(tǒng)
OS:FC6
內(nèi)核版本:2.6.18
目的:新增一個(gè)系統(tǒng)調(diào)用,將當(dāng)前進(jìn)程的UID和EUID都設(shè)置成0(超級(jí)用戶)
步驟:
1 內(nèi)核源碼樹(shù)位置:SRC=/usr/src/redhat/BUILD/kernel2.6.18/linux-2.6.18.i386
2 增加新系統(tǒng)調(diào)用號(hào),修改頭文件
$SRC/include/arm-i386/unistd.h
   。
   。
   。
#define __NR_splice             313
#define __NR_sync_file_range    314
#define __NR_tee                315
#define __NR_vmsplice           316
#define __NR_move_pages         317
#define __NR_mysyscall          318 /*新增加的一行,其中318是系統(tǒng)調(diào)用號(hào),
                                    根據(jù)系統(tǒng)不同自己定義與已經(jīng)有的系統(tǒng)
                                   調(diào)用號(hào)不相同即可*/
3 修改系統(tǒng)調(diào)用表。修改文件
$SRC/arch/i386/kernel/syscall-table.s(注意,以前版本的內(nèi)核應(yīng)該修改和前面文件同
級(jí)目錄下的entry.s)
ENTRY(sys_call_table)
        .long sys_restart_syscall       /* 0 - old "setup()" system call, used
for restarting */
        .long sys_exit
        .long sys_fork
        .long sys_read
        .long sys_write
        .long sys_open          /* 5 */
        .long sys_close
        .long sys_waitpid
        .long sys_creat
        .long sys_link
        .long sys_unlink        /* 10 */
        .
        .
        .
        .long sys_mysyscall           /*新增加一行*/
4 定義新系統(tǒng)調(diào)用的具體內(nèi)容,一般可以直接在$SRC/kernel/sys.c中添加,
當(dāng)然也可以加入與其功能緊密聯(lián)系的代碼中去。這里我加在$SRC/kernel/sys.c中,
在該文件末尾加入:
asmlinkage int sys_mysyscall(void)
{
        current->uid = current->euid  = 0;
        return 0;
}
5 通常我們?cè)谟脩魧邮褂孟到y(tǒng)調(diào)用都是通過(guò)C庫(kù)支持來(lái)使用的,也就是說(shuō)C庫(kù)中對(duì)系統(tǒng)調(diào)用
進(jìn)行了一次封裝
,可以通過(guò)查看glibc的源碼可以看到具體封裝過(guò)程。由于glibc十分龐大,如果我們自己
新定義對(duì)上面新增
系統(tǒng)調(diào)用的C庫(kù)函數(shù)的話,編譯時(shí)間太長(zhǎng),所以我想直接利用LINUX提供的宏_syscallN來(lái)完
成。
其中N是系統(tǒng)調(diào)用的參數(shù)個(gè)數(shù)。舉例說(shuō)明該宏的用法:
對(duì)于系統(tǒng)調(diào)用open()的定義本來(lái)是:
long open(const char* filename,int flags,int mode)
如果不靠c庫(kù)支持使用該系統(tǒng)調(diào)用方法如下:
#define __NR_open 5  /*5是open的系統(tǒng)調(diào)用號(hào)*/
_syscall3(long,open,const char* filename,flags,mode)
有了這些定義后下面對(duì)open可以直接調(diào)用了
(一般書上都會(huì)講到這種方法),但是在實(shí)際操作過(guò)程中,會(huì)發(fā)現(xiàn)在2.6.X中,已經(jīng)取消了
宏_syscallN的定義,所以
你在編譯的時(shí)候是通不過(guò)的。當(dāng)然2.6取消了這些宏定義,我們可以自己在版本的代碼中找
出這些宏定義加上即
在2.4.18內(nèi)核的源代碼中,可以在其內(nèi)核源碼樹(shù)下include/asm-i386/unistd.h中找到這些
宏定義:
#define __syscall_return(type, res) \
do { \
        if ((unsigned long)(res) >= (unsigned long)(-125)) { \
                errno = -(res); \
                res = -1; \
        } \
        return (type) (res); \
} while (0)
#define _syscall0(type,name) \
type name(void) \
{ \
long __res; \
__asm__ volatile ("int $0x80" \
        : "=a" (__res) \
        : "0" (__NR_##name)); \
__syscall_return(type,__res); \
}
#define _syscall1(type,name,type1,arg1) \
type name(type1 arg1) \
{ \
long __res; \
__asm__ volatile ("int $0x80" \
        : "=a" (__res) \
        : "0" (__NR_##name),"b" ((long)(arg1))); \
__syscall_return(type,__res); \
}
#define _syscall2(type,name,type1,arg1,type2,arg2) \
type name(type1 arg1,type2 arg2) \
{ \
long __res; \
__asm__ volatile ("int $0x80" \
        : "=a" (__res) \
        : "0" (__NR_##name),"b" ((long)(arg1)),"c" ((long)(arg2))); \
__syscall_return(type,__res); \
}

。
。
將這些代碼copy到你自己的$SRC/include/asm-i386/unistd.h(我在實(shí)際中去掉了所有宏

包含變量errno的一行,因?yàn)樵谖覀兊拇a中沒(méi)有這個(gè)變量的定義,即使你在其中加入
extern int errno;
在編譯沒(méi)問(wèn)題,鏈接也會(huì)有問(wèn)題的,試試就知道了,如果非要使用errno,那就自己專研吧
,呵呵。
6 所有準(zhǔn)備工作完成,現(xiàn)在就是編譯新內(nèi)核了(可能有人會(huì)提到將這個(gè)系統(tǒng)調(diào)用以模塊方
式加載就不用重新
編譯內(nèi)核了,想法是好的,但是考慮到安全問(wèn)題,不知道是從什么版本開(kāi)始,已經(jīng)取消了
對(duì)系統(tǒng)調(diào)用表
sys_call_table的導(dǎo)出,所以你在模塊中是沒(méi)法訪問(wèn)系統(tǒng)調(diào)用表的,當(dāng)然也可以通過(guò)其他
途徑來(lái)完成這個(gè)任務(wù)
,不過(guò)那是hacker們的辦法了,這里不加討論)
在$SRC中
make menuconfig
make
make install
即可,在2.6中已經(jīng)對(duì)編譯內(nèi)核的方法簡(jiǎn)化了許多,不需要以前對(duì)依賴關(guān)系的檢查了,新的
Makefile幫助完成這些工作了。
在make install中已經(jīng)幫你完成了
(1)將新內(nèi)核鏡像bzImage拷貝到/boot/vmlinuz-verison
(2)構(gòu)建新的initrd-version.img文件
(3)創(chuàng)建新的內(nèi)核符號(hào)表System.map(這個(gè)文件不是內(nèi)核啟動(dòng)必須的,一般調(diào)試用)
(4)修改你的grub或者lilo啟動(dòng)文件
所以你只需要reboot就可以看到你新編譯的內(nèi)核了。至于內(nèi)核的配置和vmlinuz和initrd2
個(gè)文件各自的用處,大家可以上網(wǎng)查詢,這里
不詳細(xì)介紹了。如果你的新內(nèi)核無(wú)法啟動(dòng),多半是initrd出了問(wèn)題(簡(jiǎn)單的說(shuō)下initrd文
件包含了你的內(nèi)核在加載文件系統(tǒng)前的一些驅(qū)動(dòng)程序
比如硬盤驅(qū)動(dòng),ext3文件系統(tǒng)的驅(qū)動(dòng)等等,如果這些有問(wèn)題,內(nèi)核是無(wú)法啟動(dòng)的,網(wǎng)上說(shuō)
可以把這些一起編譯到內(nèi)核vmlinuz中而不需要initrd,
大家可以去試試)
7 現(xiàn)在新內(nèi)核啟動(dòng)起來(lái)了,我們寫一個(gè)用戶測(cè)試程序mysyscall.c使用我們新的系統(tǒng)調(diào)用吧
。
#include
#include
#include
#include
#include
#define __NR_mysyscall 318
_syscall0(int,mysyscall)
int main()
{
        printf("before, my euid is: %d!\n",geteuid());
        if(open("/etc/shadow",O_RDONLY)0)
                printf("open succeed!\n");
      
        return 0;
}
在普通用戶下運(yùn)行該程序
before, my euid is: 500!
open failed!
after, my euid is 0!
open succeed!
發(fā)現(xiàn)居然可以訪問(wèn)本來(lái)只有root能訪問(wèn)的shadown文件了 o(∩_∩)o!
歡迎大家討論!
                                                            八戒
                                                          2007。8.14


本文來(lái)自ChinaUnix博客,如果查看原文請(qǐng)點(diǎn):http://blog.chinaunix.net/u/21973/showart_361504.html
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP