CSAPP attacklab
Phase 1
getbuf 的栈帧如图所示,只需先输入 40 个字节,然后输入 touch1 的起始地址即可。
Phase 2
需要在缓冲区内输入一段指令,从 getbuf 返回时开始执行这段指令。这段指令需要向 touch2 传入 cookie,并将返回地址设置为 touch2。
指令很容易书写
1 |
|
查看 %rsp 得到地址,这就是缓冲区的起始地址。
所以根据上面的汇编指令得到相应的机器代码放入缓冲区,并将 getbuf 的返回地址替换为缓冲区的起始地址。
Phase 3
和 phase 2 有两处区别:一是 %rdi 中存放的不再是 cookie 而是 cookie 的地址,二是 hexmatch 会写栈,getbuf 的栈帧可能会被破坏。
期望的栈帧如下:
Phase 4
考虑使用这两组指令,将栈上的 cookie 赋给 %rax,再送给 %rdi
1 |
|
对应的机器代码为
1 |
|
可以在 0x4019ab 和 0x4019c5 找到。
Phase 5
感觉很困难,韩了一份别人的:
- 先取得栈顶指针的位置
- 取出存在栈中得偏移量的值
- 通过
lea (%rdi,%rsi,1),%rax
得到 cookie 的地址 - 将 cookie 的地址传给
%rdi
- 调用
touch 3
1 |
|
(图里 cookie 和 touch3 好像写反了)
1 |
|
![图6](/img/attacklab 6.png)
撒花!
CSAPP attacklab
https://je3ter.github.io/2024/02/17/CSAPP/CSAPP attacklab/