攻击堆栈

时间:2010-11-03 02:17:44

标签: c stack

我正在处理一个二进制文件。它有一个地址从123开始的函数。我需要让我的代码执行这个函数。

二进制文件接受大小为'n'的字节数组,不检查边界。整个任务实际上是溢出缓冲区并导致坏事发生。

同样,工作是调用地址123并让它执行。我的印象是,如果缓冲区大小为“4”,并且我传递了9个字符..,则会在堆栈中放置5个字符并执行。 (这是真的吗?)

另外,为了让我得到要执行的地址,我想说“拨打123”。据我所知,“电话”是“e8”,不是吗?

这个问题对我来说有点混乱。如果有人能帮助我更好地理解它,我会非常感激

(是的,这是一个家庭作业问题)

3 个答案:

答案 0 :(得分:4)

我强烈建议您阅读Smashing the Stack for Fun and Profit。它详细描述了完成此操作所需的步骤。

答案 1 :(得分:1)

堆栈不包含代码,但它确实包含函数的返回地址。典型的堆栈结构是:

<stack data> <old frame pointer> <return address>
有时会省略

<old frame pointer>,我认为必须这样做,所以你需要提供的是填充数组然后123的数据。

答案 2 :(得分:0)

一种常见的策略是在固定的内存地址中找到call ESP操作码,并用该地址覆盖返回地址。通过这种方式,执行将在堆栈上继续。如果没有DEP激活(或支持),它将起作用。

在您的情况下,您还可以在内存中查找abs_jump 123

编辑: @Loren它只有在可以执行堆栈时才有效。 call esp只有两个字节的操作码,因此很有可能在内存中找到它。第二种方法不是从堆栈执行代码,而是需要一个5字节的操作码,这是不太可能找到的。