Question
Hack 09
1. 栈从高往低走
2. 说出函数调用前后栈的变化情况
- 父亲: push 传递参数 => push 返回地址 => call
- 儿子: push old ebp(保存ebp) => ebp=esp(更新ebp) => 调整esp(为临时变量开辟空间)
- 可以看到传递参数和返回地址在ebp的上面,临时用的变量在ebp的下面
3. 为什么儿子esp->ebp 这一环节中就能保证 esp 就是栈顶?可以发现,之前的种种操作,虽然栈上添加了许多东西,但是根本没有改变esp的值!
因为esp在函数一开始就是这个函数的最大栈顶,可以看儿子部分中的调整esp,可以看出,每个函数执行开始,就已经把esp调到了栈的顶端,而不是说,每次往栈添加东西,都要去调整esp.
PC --> RIP
FP --> RBP
Hack10
基本知识:
1. 说出函数传参对应的寄存器(看手册就好,不用强记)
Hack12
1. 某个类拥有成员函数时,该函数实现在内存只有一个,如果该类调用此函数,实际情况是什么?
(即对于foo:func(int a, int b)
这种函数而言,foo A
调用func
的实际情况是什么样子)
Hack14
从汇编代码定位源代码位置
1. 首先查看附件的call func,标记可疑点:
- 注意点:很有可能并不是直接调用某个函数,而是调用了A函数,A函数中又调用了func
2. 利用 crash 查看结构体成员
- 如果出现invalid data structure,怎么解决?
- 如何查看结构体的偏移量?
- 如何用十六进制显示?
3. 偷懒方法,利用 crash 中的 dis -l
,可以查看汇编代码和源代码的关系
GDB使用
1. 如何查看帧的情况及其变量内容
2. 如何查看Seg Fault的最后一个汇编代码
3. 如何查看及修改系统规定的每个程序中栈的最大大小
4. 当有2个参数因为寄存器不够用了而传入栈,此时怎么查询,应该查几个