zoukankan      html  css  js  c++  java
  • 2019-2020-1 20199323《Linux内核原理与分析》第八周作业

    1、编译链接的过程

    程序从源代码到可执行文件的步骤:预处理、编译、汇编、链接。指令分别为:

    • 预处理:
      • gcc -E hello.c -o hello.i
    • 编译:
      • gcc -S hello.i -o hello.s
    • 汇编:
      • gcc -c hello.s -o hello.o
    • 链接:
      • gcc hello.o -o hello -m32 -static

    2、elf文件的格式:

    3、实验部分:

    首先更新内核,然后进入menu里面将test_exec.c替换test.c的内容:

    然后启动内核,输入fork和exec进行验证是否有这两个函数:

    然后设置断点sys_execve,然后按c停在断点处:

    第三个断点start_thread处,可以看到修改了eip的值,它作为新程序的起点:

    输入readelf -h hello可以查看hello的EIF头部:

    4、问题解析

    新的可执行程序执行的起点在修改调用execve系统调用时压入内核堆栈的eip寄存器的值。
    为什么execve系统调用返回后新的可执行程序能顺利执行? 因为在系统调用过程中,父进程的大部分资源被抛弃,堆栈被清空,新的可执行程序根据传递的参数和环境变量配置了一个新的堆栈。所以返回时能够正常执行。

  • 相关阅读:
    Wireshark下载地址
    WireShark过滤语法
    Centos7 虚拟机安装增强功能
    更改切换热键
    kali安装后中文乱码
    C#中关于WebBrowser的一些细节设置
    方法间多参数传递
    绑定checkedComboBox
    反射方法调用例子
    gridView 删除一行后自动定位到指定行
  • 原文地址:https://www.cnblogs.com/w741741/p/11820687.html
Copyright © 2011-2022 走看看