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 |