首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AMD64溢出和空字节

AMD64溢出和空字节
EN

Security用户
提问于 2012-08-15 11:01:32
回答 2查看 1.7K关注 0票数 11

在过去,我成功地溢出了我自己的易受攻击的程序,以及其他程序,但只有在32位的环境中。每次我在64位的机器上尝试一个简单的堆栈粉碎,我都会遇到问题。我试图写的地址总是包含空字节。

昨天是一个简单的问题例子;我试图覆盖GOT,以使以后对printf()的调用变成对system()的调用,我有我需要的所有地址(ASLR,DEP on)。

当我试图用heapland (低内存地址)值覆盖堆栈指针(高内存地址)时,我陷入了困境。

代码语言:javascript
复制
0x7fffffff_ff480a90 -> 0x00000000_0068a9a0

我的溢出以\xa0\xa9\x68结束,使用null终止符使指针看起来像;

代码语言:javascript
复制
0x7fffffff_0068a9a0

这不太好,我看了好几个小时,都想不出办法来解决这个问题。就像我说的,我多次遇到这个空字节问题。我一直认为这只是其中之一,但它似乎完全不可能黑一个64位系统,因为地址往往包含空字节。

我只是运气不好吗?我漏掉了什么明显的东西吗?我从未听说过有人在32对64之间谈论这个问题。

EN

回答 2

Security用户

回答已采纳

发布于 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。每个溢出都允许您编写一个终止空字节,您想要写三个空字节,因此有三个溢出。

票数 3
EN

Security用户

发布于 2012-08-24 08:47:48

你可能想读一下这个http://www.x86-64.org/documentation/abi.pdf

本质上,x86和x64在工作方式上是不同的。新的ABI描述了它处理叶子和非叶子调用、异常处理和展开的新方法。

因为它的目的本质上是溢出--你需要了解新的ABI是如何工作的,以及它现在在稍微不同的地方的位置,以便能够“插入”和“更改”。

票数 4
EN
页面原文内容由Security提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://security.stackexchange.com/questions/18718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档