在过去,我成功地溢出了我自己的易受攻击的程序,以及其他程序,但只有在32位的环境中。每次我在64位的机器上尝试一个简单的堆栈粉碎,我都会遇到问题。我试图写的地址总是包含空字节。
昨天是一个简单的问题例子;我试图覆盖GOT,以使以后对printf()的调用变成对system()的调用,我有我需要的所有地址(ASLR,DEP on)。
当我试图用heapland (低内存地址)值覆盖堆栈指针(高内存地址)时,我陷入了困境。
0x7fffffff_ff480a90 -> 0x00000000_0068a9a0我的溢出以\xa0\xa9\x68结束,使用null终止符使指针看起来像;
0x7fffffff_0068a9a0这不太好,我看了好几个小时,都想不出办法来解决这个问题。就像我说的,我多次遇到这个空字节问题。我一直认为这只是其中之一,但它似乎完全不可能黑一个64位系统,因为地址往往包含空字节。
我只是运气不好吗?我漏掉了什么明显的东西吗?我从未听说过有人在32对64之间谈论这个问题。
发布于 2013-03-25 15:20:12
首先,你的例子有些奇怪。实现amd64 64模式的当前处理器(又名x86_64,又名x64,也就是一堆其他名称)不使用完整的64位地址寄存器。它们使用48位地址,并强制要求第48位到第63位是相同的(就好像它是“符号扩展”一样)。因此,像7fffffff_ff480a90这样的地址不会被任何当前生产的CPU所接受。更有可能的是,你有00007fff_ff480a90。这将问题减少到两个字节而不是四个字节。
一种一般的方法是执行几个连续的溢出;这取决于您可以溢出数据的确切条件,这可能是可能的,也可能是不可能的。有了几次溢出,您将目标槽替换为00000054_54545454,然后是00000000_54545454,最后是00000000_0068a9a0。每个溢出都允许您编写一个终止空字节,您想要写三个空字节,因此有三个溢出。
发布于 2012-08-24 08:47:48
你可能想读一下这个http://www.x86-64.org/documentation/abi.pdf
本质上,x86和x64在工作方式上是不同的。新的ABI描述了它处理叶子和非叶子调用、异常处理和展开的新方法。
因为它的目的本质上是溢出--你需要了解新的ABI是如何工作的,以及它现在在稍微不同的地方的位置,以便能够“插入”和“更改”。
https://security.stackexchange.com/questions/18718
复制相似问题