首页 > 系统服务 > 详细

Linux内核分析— —扒开系统调用的三层皮(下)

时间:2016-03-27 17:51:47      阅读:245      评论:0      收藏:0      [点我收藏+]

课程主要内容有三点:

  1. 在MenuOS中通过添加代码增加自定义的系统调用命令
  2. 使用gdb跟踪调试内核
  3. 简单分析system_call代码了解系统调用在内核代码中的处理过程

由于本周实验是在Kali虚拟机上进行操作的,具体实现过程中的代码和实验楼里的环境有一定的差异,在解决了各种报错之后终于完成了实验,在这次的实验报告中将较为详细的记录实验过程中遇到的问题以及解决方案,以便以后更加熟练地理解与掌握Kali的操作原理和步骤。

实验——分析system_call中断处理过程

在MenuOS中添加上周所运用到的系统调用

即在Linuxkernel/menu/test.c文件中,添加代码如下:

    int Mkdir()
    {
        const  char *ch = "test"; //创建的文件夹名称
        mode_t mode = 0700;        //创建的文件夹的权限
        int flag = 0;        //是否创建成功新的文件夹的标识符
        flag = mkdir(ch,mode);    //调用mkdir
        if(flag==0)                //flag=0则创建成功,否则失败
        {
             printf("succeed");
        }
        else
            printf("error");
        return 0;
    }
    int MkdirAsm()
    {
         char *ch="test-asm"; //创建文件夹的名称
        mode_t mode=S_IRWXU;  //创建新的文件夹的权限
        int flag=0;            //标识符
        asm volatile(
                "mov $0x27,%%eax\n\t"    //系统调用号赋给eax寄存器
                "mov %1,%%ebx\n\t"        //将文件夹的名称赋给ebx寄存器
                "mov %2,%%ecx\n\t"        //将文件夹的权限赋给ecx寄存器
                "int $0x80\n\t"            //开启中断,执行mkdir系统调用
                "mov %%eax,%0\n\t"        //将返回值赋给flag
                :"=m"(flag)                //输出变量flag
                :"d"(ch),"D"(mode)        //输入变量ch与mode
                );
        if(flag==0)            //flag=0则创建成功,否则失败
            printf("succeed");
        else
            printf("error");
        return 0;
    }

    int main()
    {
        PrintMenuOS();
        SetPrompt("MenuOS>>");
        MenuConfig("version","XXX V1.0(Menu program v1.0 inside)",NULL);
        MenuConfig("quit","Quit from XXX",Quit);
    MenuConfig("mkdir","Make up a new director",Mkdir);
        MenuConfig("Mkdirasm","Make up a new director by asm",MkdirAsm);
        ExecuteMenu();
      }
  • make rootfs即可完成功能的添加

gdb单步调试系统调用mkdir

    • 设置断点:
      技术分享

    • 在MenuOS界面输入mkdir,则发现停在了system_mkdir该函数处:
      技术分享

    • 进行单步调试,发现其步骤大约为读取pathname(所需要创建文件夹的名称),配置权限,完成创建:
      技术分享

    • 同理输入命令mkdirasm,完成单步调试,与mkdir一样的结果(因为都是调用系统调用mkdir)

    • 输入c,将程序进行完,则出现最终结果:
      技术分享

 

从system_call开始到iret结束过程流程图
技术分享

system_call的处理过程中:

xyz<=系统调用号=>sys_xyz()
int 0x80<=中断向量=>system_call

 

Linux内核分析— —扒开系统调用的三层皮(下)

原文:http://www.cnblogs.com/20135213lhj/p/5325947.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!