zoukankan      html  css  js  c++  java
  • linux及安全第五周总结——20135227黄晓妍

    (注意:本文总结备份中有较多我手写笔记的图片,其中重要的部分打出来了。本文对分析system_call对应的汇编代码的工作过程,系统调用处理过程”的理解,以及流程图都写在实验部分。

    实验部分

    使用gdb跟踪分析一个系统调用内核函数

    1. 强制删除menu (rm menu -rf)
    2. 更新menu代码至最新版本(git clone https://github.com/mengning/menu.git)
    3. 在test.c中main函数中增加MenuConfig,以及增加上周自己选择Getegid,GetegidAsm的代码
    4. Make roofts自动编译,生成,和启动根文件系统

    在test.c的main中增加menuconfig

    增加我的函数getegid和getegidasm

    int Getegid(int argc,char *argv[])

    {

             gid_t gid;

             gid = getegid ();

             printf(“gid=%d”,gid);

             return 0;

    }

    int GetegidAsm(int agrc,char *argv[])

    {

             gid_t gid;

             gid = getegid ();

             asm volatile(

             “mov $0x32,%%eax ”

             “int $0x80 ”

             “mov %%eax,%0 ”

             :”=m”(gid)

    );

             printf(“gid=%d”,gid);

             return 0;

    }

    make rootfs然后查看一下,发现新增加了getegid和getegid_asm命令

    getegid一下

    使用gdb跟踪调试内核

    qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S # 关于-s和-S选项的说明:

    # -S freeze CPU at startup (use ’c’ to start execution)

    # -s shorthand for -gdb tcp::1234 若不想使用1234端口,则可以使用-gdb tcp:xxxx来取代-s选项

    另开一个shell窗口

    gdb

    (gdb)file linux-3.18.6/vmlinux # 在gdb界面中targe remote之前加载符号表

    (gdb)target remote:1234 # 建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行

    查看50     i386 getegid                       sys_getegid16

    (gdb)break  sys_getegid16# 断点的设置,注意寻找对应的系统调用函数名字,例如time命令对应sys_time

    示例:gdb跟踪sys_time

    跟踪调试

    system_call对应的汇编代码的工作过程

    sys_call只是汇编代码的声明,不是函数,所以gdb无法跟踪sys_call的位置,但是sys_call里包含的系统调用的时机非常重要:

    中断向量int0x80如何与sys_call绑定的呢?

    initmain.c里的start_kernel里有trap_init()函数

    archx86kernel raps.c中有一个函数,将SYSCALL_WECTOR(系统调用中断向量)和system_call汇编代码的入口绑定。完成初始化。

    系统调用处理过程 

    用户态的函数根据API接口,申请一个系统调用,触发int0x80中断向量指令,中断int指令(保护现场)保存用户态的栈顶地址,当时的状态字,当时的cs:eip值和内核态的栈顶指针,当时的状态字,和中断处理程序的入口(sys_call)sys_call_table根据系统调用号查找对应的函数,如果当前进程需要调度或者有其他的信号需要处理,则分别调度和处理,如果不需要,运行函数,恢复现场(restore_all), 最后iret结束。下面我用流程图展示系统调用处理的过程(sytem call到iret之间):

     

    总结部分:

    一:如何给menuOS增加自己编写的命令Getegid,GetegidAsm

    1.      强制删除menu (rm menu -rf)

    2.      更新menu代码至最新版本(git clone https://github.com/mengning/menu.git)

    3.      在test.c中main函数中增加MenuConfig,以及增加上周自己选择Getegid,GetegidAsm的代码

    4.      Make roofts自动编译,生成,和启动根文件系统

    二:gdb跟踪自己编写的系统调用函数Getegid,GetegidAsm

    使用gdb跟踪调试内核

    qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S # 关于-s和-S选项的说明:

    # -S freeze CPU at startup (use ’c’ to start execution)

    # -s shorthand for -gdb tcp::1234 若不想使用1234端口,则可以使用-gdb tcp:xxxx来取代-s选项

    另开一个shell窗口

    gdb

    (gdb)file linux-3.18.6/vmlinux # 在gdb界面中targe remote之前加载符号表

    (gdb)target remote:1234 # 建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行

    (gdb)break start_kernel # 断点的设置,注意寻找对应的系统调用函数名字,例如time命令对应sys_time

    示例:gdb跟踪sys_time

    三:系统调用在内核代码中的工作机制和初始化

    在x86/kernel/entry_32.S里有ENTRY(system call)

    sys_call只是汇编代码的声明,不是函数,所以gdb无法跟踪sys_call的位置,但是sys_call里包含的系统调用的时机非常重要:

    中断向量int0x80如何与sys_call绑定的呢?

    initmain.c里的start_kernel里有trap_init()函数

    archx86kernel raps.c中有一个函数,将SYSCALL_WECTOR(系统调用中断向量)和system_call汇编代码的入口绑定。完成初始化

    四:简化汇编伪代码

    Save_all保存现场

    Sys_call_table:绑定系统调用函数

    Interrupt_return:结束

     

  • 相关阅读:
    VBS修改本机的账号密码
    验证是否为全局编录服务器
    通过CMD命令设置网络参数
    VBS映射网络驱动器 映射网络驱动器
    命令提示符映射网络驱动器
    获得域内包括工作组内的所有计算机及其信息
    VirtualBox安装Redhat9.0
    启动和停止Oracle服务bat脚本
    Vim常用命令
    使用为知笔记客户端发布博客到【博客园】
  • 原文地址:https://www.cnblogs.com/angelahxy/p/5313626.html
Copyright © 2011-2022 走看看