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](博客链接)
    - 结对照片
    - 结对学习内容
    

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

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

    参考资料

  • 相关阅读:
    tomcat最大线程数的设置(转)
    webService接口大全
    实用工具网站汇总
    Linux常用指令(待补充)
    svn的使用总结(待补充)
    养生
    nodejs知识结构
    NVM node版本管理工具的安装和使用
    MongoDB安装和MongoChef可视化管理工具的使用
    JavaScript模块化编程(三)
  • 原文地址:https://www.cnblogs.com/besti155214/p/7696128.html
Copyright © 2011-2022 走看看