章节大纲

  • 在这个任务中我们将将易受攻击的程序编译成一个名为 stack-L3 的 64 位二进制文件。 我们将在该程序上启动攻击。编译和设置命令已包含在 Makefile 中,与前一任务相似,在报告中需要详细说明你的攻击。

    使用 gdb 在 64 位程序上进行调查与在 32 位程序上的方式相同。 唯一的区别是框架指针寄存器的名称不同。在 x86 架构中,框架指针为 ebp 而在 x64 架构中,则是 rbp。

    相比 32 位机器上的缓冲区溢出攻击,在 64 位机器上发起攻击更加困难。最困难的部分在于地址。虽然 x64 架构支持 64 位地址空间,但只有从 0x00 到 0x00007FFFFFFFFFFF 的地址是允许的。这意味着对于每个地址(8字节),最高两位总是为零。 这导致了问题。

    在我们的缓冲区溢出攻击中,我们需要在一个 payload 中至少存储一个地址,并通过 strcpy() 将其复制到堆栈中。我们知道 strcpy() 在遇到零时会停止复制。因此,如果 payload 中的中间位置出现了零,则该位置之后的内容将无法被复制到堆栈中。 如何解决这个问题是这个攻击中最困难的挑战。