科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道关于Linux内核级后门的原理和简单实战 (2)

关于Linux内核级后门的原理和简单实战 (2)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

首先, 所有的寄存器被保存并且%eax寄存器全面检查系统调用表, 这张表列举了所有的系统调用和他们的地址信息。它可以通过extern void *sys_call_table[]来被访问到。 该表中的每个定义的数值和内存地址都对应每个系统调用。

作者:sixth 来源:linux8 2007年11月4日

关键字: 实战 原理 内核 Linux

  • 评论
  • 分享微博
  • 分享邮件
 

* _system_call()是如何工作的 ?

首先, 所有的寄存器被保存并且%eax寄存器全面检查系统调用表, 这张表列举了所有的系统调用和他们的地址信息。它可以通过extern void *sys_call_table[]来被访问到。 该表中的每个定义的数值和内存地址都对应每个系统调用。大家可以在/usr/include/sys/syscall.h这个头中找到系统调用的标示数。他们对应相应的SYS_systemcall名。假如一个系统调用不存在, 那么它在sys_call_table中相应的标示就为0, 并且返回一个出错信息。否则,系统调用存在并在表里相应的入口为系统调用代码的内存地址。

这儿是一个有问题的系统调用例程:

[root@plaguez kernel]# cat no1.c
#include
#include
#include
extern void *sys_call_table[];
sc()
{ // 165这个系统调用号是不存在的。
    __asm__(
        "movl $165,%eax
             int $0x80");
}
main()
{
    errno = -sc();
    perror("test of invalid syscall");
}
[root@plaguez kernel]# gcc no1.c
[root@plaguez kernel]# ./a.out
test of invalid syscall: Function not implemented
[root@plaguez kernel]# exit

系统控制权就会转向真正的系统调用, 用来完成你的请求并返回。 然后_system_call()调用_ret_from_sys_call()来检查不同的返回值, 并且最后返回到用户内存。

* libc

这int $0x80 并不是直接被用作系统调用; 更确切地是, libc函数,经常用来包装0x80中断,这样使用的。

libc通常利用_syscallX()宏来描述系统调用, X是系统调用的总参数个数。

举个例子吧, libc中的write(2)就是利用_syscall3这个系统调用宏来实现的, 因为实际的write(2)原型需要3个参数。在调用0x80中断之前,这个_syscallX宏假定系统调用的堆栈结构和要求的参数列表,最后,当_system_call()(通过int &0x80来引发)返回的时候,_syscallX()宏将会查出错误的返回值(在%eax)并且为其设置errno。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章