zoukankan      html  css  js  c++  java
  • 2017-2018-1 20155214 《信息安全系统设计基础》 第5周学习总结

    2017-2018-1 20155214 《信息安全系统设计基础》

    第5周学习总结

    教材学习内容总结

    1.运用gcc -O1 -S code.c得到C编译器产生的代码
    2.运用gcc -O1 -c code.c将编译并汇编该代码得到二进制文件code.o
    3.运用objdump -d code.o可以实现反汇编
    4.以'.'开头的行都是知道汇编器和链接器的命令。

    教材学习中的问题和解决过程

    • 问题1:
    最初的8086的储存器模型和它在80286中的扩展都已经过时了。作为替代,Linux使用了平坦寻址方式,将整个储存空间看作一个大的字节数组。
    

    平坦寻址方式是什么。

    • 问题1解决方案:
      查询wikipedia,the key feature of a flat memory model is that the entire memory space is linear, sequential and contiguous from address zero to MaxBytes − 1说明该模型将内存看作是是连续的线性数组空间,其32位偏移量即线性地址。
      在平坦寻址下,可以最大化的灵活性和执行速度 。但缺乏安全性,当段限长设置为4GB时,即使所访问的地址处并没有物理内存时,处理器也不会产生“超出内存范围”异常。

    • 简单的安全解决方式即IA-32系统下提供保护模式的内存管理,参考《IA-32架构软件开发人员手册》可知:

    受保护的平坦模型与基本平坦模型类似,只是段限长被设定为在实际物理内存范围内
    如果试图访问实际内存范围以外的地址,会产生一个通用保护异常 (#GP)。
    这个模型稍微利用了一点硬件的保护机制来防止一些程序的错误。

    • 问题2:
      如何退出反汇编二进制代码中的跳转目标?
    8048357  72 e7  jb XXXXXXX 
    8048359  
    
    • 问题2解决方案
      因为执行PC相关寻址时,程序计数器的值是跳转指令后面的指令的地址。
      因此,下一条指令地址8048359加上偏移量e7即为jb的目标地址。
      将0xe7以补码形式表示为11100111,十进制为-25,即8048359-0x19,目标地址为8048340。

    • 问题3:
      函数参数调用中,如何理解通过增加栈指针来释放空间?

    • 问题3解决方案:

      新的过程(该函数的ebp)的ebp设置为栈帧的开始位置。然后将栈指针减去x,从而在栈上分配了x字 节的空间.

    • 测试用例

    void swap(int * a, int *b)
    {
      int c;
      c = *a; *a = *b; *b = c;
    }
    
    int main()
    {
       int a, b;
       a = 16; b = 32;
       swap(&a, &b);
       return (a - b);
    }
    


    编译出main.s文件

    其中 38 subl $28, %esp,为整形局部变量a,b分配了28字节空间。而这28字节空间是通过增加栈指针后,移动栈顶指针释放栈内未初始化的空间。

    代码调试中的问题和解决过程

    • 问题1:
    • 问题1解决方案:

    Mybush的编写及实现

    • 题目要求

    使用fork,exec,wait实现mybash
    写出伪代码,产品代码和测试代码
    发表知识理解,实现过程和问题解决的博客(包含代码托管链接)

    • 题目背景

    已知fork函数用于产生一个与父进程完全相同的子进程。

    调用man execupman wait查看相关函数信息

    exec () 函数系列用于将当前进程映像替换为新的进程映像,因此可以在子进程中用于执行命令行


    所有这些系统调用都用于等待调用进程的子级中的状态更改, 并获取有关其状态已更改的子级的信息.

    mybash需要实现,用户输入命令行字符串,

    mybash创建一个新的子程序,用以执行用户命令,

    父进程中等待子进程命令执行完毕,

    循环直至退出。

    • 伪代码
    do{
    
    输入命令行字符串;
    
    产生子进程;
    
    执行命令行;
    
    等待执行结束;
    
    }while(true);
    
    • Mybush源代码
    ……
    int main(){
    
        pid_t pid;
    
        char comline[NUM];
        char *argv[NUM];
    
        do{
    
        printf("Mybash:~$ ");
    
        fgets(comline,NUM,stdin);/*输入命令行字符串*/
    
        parseline(comline,argv);/*格式转换*/
    
        pid = fork();/*产生新的子程序*/
    
        if(pid == 0){/*在子程序中执行命令*/
        
           execvp(argv[0],argv);   /*执行命令行*/
    
        }
    
        waitpid(pid,NULL,0);/*等待子进程终止*/
     
        }while(1);
    
        return 0;
    }
    ……
    
    • 测试运行截图

    代码托管

    上周考试错题总结

    • 错题1及原因,理解情况
    • 错题2及原因,理解情况
    • ...

    结对及互评

    本周结对学习情况

    - [20155216](博客链接)
    - 结对照片
    - 结对学习内容
    

    其他(感悟、思考等,可选)

    感觉汇编代码十分贴近机器底层,但目前将反汇编与信息安全相结合的思路还不够清晰。
    学习程序的机器级表示有利于我们理解数据在计算机中的转移过程,更加深入的理解计算机结构。

    参考资料

  • 相关阅读:
    GNU make manual 翻译(九十九)
    GNU make manual 翻译( 九十五)
    Shell的 for 循环小例子
    makefile中对目录遍历的小例子
    GNU make manual 翻译(九十三)
    GNU make manual 翻译( 一百)
    GNU make manual 翻译( 九十七)
    GNU make manual 翻译( 九十八)
    mapserver4.8.3 的readme.win32的中文翻译文件
    遥控器编程
  • 原文地址:https://www.cnblogs.com/besti155214/p/7696128.html
Copyright © 2011-2022 走看看