Skip to content

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个参数因为寄存器不够用了而传入栈,此时怎么查询,应该查几个

Comments