20145325张梓靖 《信息安全系统设计基础》第5周学习总结

20145325张梓靖 《信息安全系统设计基础》第5周学习总结

教材学习内容总结

  • gcc -S xxx.c -o xxx.s 获得汇编代码,也可以用objdump -d xxx 反汇编; 注意函数前两条和后两条汇编代码,所有函数都有,建立函数调用栈帧

  • 二进制文件可以用od 命令查看,也可以用gdb的x命令查看。 有些输出内容过多,我们可以使用 more或less命令结合管道查看,也可以使用输出重定向来查看
    od code.o | more
    od code.o > code.txt

  • Linux和Windows的汇编格式有点区别:ATT格式和Intel格式

  • esi edi可以用来操纵数组,esp ebp用来操作栈帧。 对于寄存器,特别是通用寄存器中的eax,ebx,ecx,edx,32位的eax,16位的ax,8位的ah,al都是独立的

  • 不能从内存地址直接MOV到另一个内存地址,要用寄存器中转一下。能区分MOV,MOVS,MOVZ,掌握push,pop,栈顶元素的地址是所有栈中元素地址中最低的

  • 局部变量保存在寄存器中

  • 有条件跳转的条件看状态寄存器(教材上叫条件码寄存器) ,leal不改变条件码寄存器

  • CMP用在不改变原数,只需要知道数据之间的关系;SUB用在需要得到两个数据进行相减后的结果; SET指令根据t=a-b的结果设置条件码

  • 函数返回值存在%eax中

  • 使用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个栈帧的详细信息。

课后作业中的问题和解决过程

对源代码进行汇编查看

相应栈帧的表示(到g1函数准备返回的时候)

问题 在用GDB进行栈帧追踪时,输入bt竟然显示的是no stack

是因为代码没运行?输入run,运行程序,结果12\n显示出来,说明代码没问题,继续输入bt,显示的还是no stack

再试试info registers,显示的没有使用寄存器,这是什么原因?
决定换用CGDB对照着代码进行下栈帧的调试,还是同样的结果,并且上半部分代码窗口没有显示出代码

用以前的代码试了试用CGDB调试,发现同样的,代码窗口都没有显示代码
解决过程 找到为什么用GDB不能调试了,因为在GCC编译的时候,没有输 -g ,所以才不能在GDB中调试,同样的,CGDB也可以正常使用了
但bt命令显示出来的东西是该代码的栈帧吗?

本周代码托管

代码托管

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 3500行 25篇 300小时
第一周 70/70 2/2 22/22
第二周 150/220 1/3 23/45
第三周 160/380 1/4 25/70
第四周 250/630 1/5 30/100

参考资料

posted @ 2016-10-16 19:08  20145325张梓靖  阅读(198)  评论(1编辑  收藏  举报