• 2017-2018-1 学号20155311 《信息安全系统设计基础》第5周学习总结


    2017-2018-1 学号20155311 《信息安全系统设计基础》第5周学习总结

    教材学习内容总结

    一、机器级代码

    • 对于机器级编程来说,两种抽象尤为重要。
    1. 指令集体系结构ISA
    2. 存储器系统
    • ISA:机器级程序的格式和行为,定义为指令集体系机构,它定义了处理器状态指令的格式,以及每条指令对状态的影响。机器级程序使用的存储器地址是虚拟地址,提供的存储器模型看上去是一个非常大的字符数组

    • PC:程序计数器。在IA32中,用%eip表示,指示将要执行的下一条指令在存储器中的地址。

    • 程序存储器:包含程序的可执行机器代码,操作系统需要的一些信息,用来管理过程调用和返回的运行时栈,以及用户分配的存储器块。

    • 反汇编器查看目标代码文件的内容。

    objdump -d xxx.xx
    
    • 二进制文件可以用od 命令查看,也可以用gdb的x命令查看。 有些输出内容过多,我们可以使用 more或less命令结合管道查看,也可以使用输出重定向来查看。
    od code.o | more
    od code.o > code.txt
    
    • 小端法的读法是与自然方向是相反的,P109页18 a0 04 08的正确顺序其实是18 a0 04 08,去掉最高位的0后即为0x804a018

    C语言数据类型在IA32中的大小

    • 一些通常对C语言程序员隐藏的机器代码在IA32中是可见的:
      程序计数器(在IA32中,通常称为“PC”,用%eip表示)指示将要执行的下一条指令在存储器中的地址。
    • 整数寄存器:包含8个命名的位置,分别存储32位的数值,这些寄存器可以存储地址(对应C语言的指针)或整数数据,有的寄存器被用来记录某些重要的程序状态,其他的寄存器用来保存临时数据,例如过程的局部变量和函数的返回值。
    • 条码寄存器:保存着最近执行的算术或逻辑指令的状态信息,他们用来实现控制或数据流中的条件变化。
      浮点寄存器:一组浮点寄存器存放浮点数据
      栈帧结构:机器用栈来传递过程参数、存储返回信息、保存寄存器用于以后恢复,以及本地存储。为单个过程分配的那部分栈称为栈帧。最顶端的栈帧以两个指针界定,寄存器%ebp为帧指针,寄存器%esp为栈指针。
    • 汇编代码:
      pushl %ebp 将寄存器%ebp的内容压入程序栈 movl %esp,%ebp 得到新栈低,将当前栈顶赋予栈低 popl %ebp过程调用结束,恢复旧栈低 ret 子程序的返回指令

    操作系统:

    • 文件:1.硬件cpu
      2.内存I/O --→字节数组

    • 虚拟内存:0-2^32-1 (逻辑地址(大) 物理地址(小)

    • 进程

    • mount把目录中文件夹映射到arm中利于调试
      静态库
      ar --→利用交叉编译器的ar

    • linux命令三要素:名字 参数 选项

    • execve(2)执行程序

    • which ls 查看ls安装目录

    • 使用GDB的堆栈跟踪功能(GDB中有很多针对调用堆栈的命令,都需要一个目标栈帧,例如打印局部变量值的命令)

    1.在栈帧之间切换

    frame args 将当前栈帧设置为args(编号或Address)指定的栈帧,并打印该栈帧的简要信息。

    up n 向上回退n个栈帧(更外层),n默认为1.
    down n 向下前进n个栈帧(更内层),n默认为1.

    2.打印栈帧信息(不移动栈帧)
    • frame 打印当前栈帧的简要信息。
    • info frame 打印当前栈帧的详细信息。
    • info frame args 打印指定栈帧的详细信息。
    • info args 打印函数参数信息。
    • info locals 打印当前可访问的局部变量的信息。
    3.打印调用堆栈
    • backtrace 打印全部栈帧的简要信息,按Ctrl-c可终止打印。
    • backtrace n 打印最内层的n个栈帧的简要信息。
    • backtrace -n 打印最外层的n个栈帧的简要信息。
    • backtrace full 打印全部栈帧的详细信息。
    • backtrace full n 打印最内层的n个栈帧的详细信息。
    • backtrace full -n 打印最外层的n个栈帧的详细信息。

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

    • 练习中关于改变push $0xff的指令后缀,请教同学后明白对于栈操作都是双字操作,所以不管是pop还是push都应该使用pushl和popl

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

    代码托管

    https://gitee.com/gaoziyun11/Linux/tree/master/第五周

    学习进度条

    代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
    目标 5000行 30篇 400小时
    第一周 200/200 2/2 20/20
    第二周 300/500 2/4 18/38
    第三周 500/1000 3/7 22/60
    第四周 300/1300 2/9 30/90
  • 相关阅读:
    C#通过文件头判断图像格式(摘录)
    devenv.exe 应用程序错误
    LINQ TO SQL中的selectMany(转)
    DragDrop registration did not succeed. (摘录)
    API各函数作用简介(转)
    Linq递归用法(摘录)
    (转)逐步为对象集合构建一个通用的按指定属性排序的方法
    何止 Linq 的 Distinct 不给力(转)
    关于sql日志文件
    DES算法的C#实现
  • 原文地址:https://www.cnblogs.com/gaoziyun11/p/7711268.html
Copyright © 2020-2023  润新知