章节大纲

  • x64 架构引起的挑战是地址中的零。尽管 x64 架构支持 64 位地址空间,但只允许从 0x00 到 0x00007FFFFFFFFFFFF 的地址。这意味着对于每个地址(8字节),最高的两个字节总是零。这导致了一个问题。
     
    在攻击中,我们需要在格式字符串中放置地址。对于 32 位程序,我们可以将地址放在任何地方,因为里面没有零,但对于 64 位程序我们不能再这样做。如果你把一个地址放在格式字符串的中间,当 printf() 使用这个格式字符串时,当它看到一个零时,就会停止。所以格式字符串中的第一个零之后的任何东西都不会被认为是格式字符串的一部分。
     
    零引起的问题与在缓冲区溢出攻击中不同,在缓冲区溢出攻击中,如果使用了 strcpy(),出现零将终止内存复制。在这里,我们没有程序中的内存复制,所以我们的输入中可以有零,但是放在哪里是关键的。有很多方法可以解决这个问题,在实验报告中,你应该解释他们是如何解决这个问题的。