2010-11-03 81 views
1

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

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

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

此外,为了让我得到要执行的地址,我想说“致电123”。从我所了解的“电话”是“e8”,不是?

这个问题对我来说有点困惑。如果有人可以帮助我更好地理解它,我将非常感激

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

+0

0xE8是相对调用,你需要调用一个绝对地址。堆栈通常是“浮动”的。 – ruslik 2010-11-03 02:25:00

+3

我希望我们有这些家庭作业.. – ruslik 2010-11-03 02:26:09

+0

只是有点好奇 - 我会认为像这样的安全类会有一个汇编语言的先决条件。这是怎么回事? – 2010-11-03 03:04:33

回答

1

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

<stack data> <old frame pointer> <return address> 

<old frame pointer>有时省略,我认为将不得不为这个,所以你必须提供的是数据,填补了数组,那么123

+0

用于提及栈上的返回地址。 – casablanca 2010-11-03 02:52:15

0

一个常见的策略是在固定的存储器地址中找到一个call ESP操作码,并用此地址覆盖返回地址。这样执行将继续在堆栈上。如果没有DEP激活(或支持),它将工作。

在你的情况下,你也可以在内存中寻找abs_jump 123

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

+0

或将其作为用于粉碎堆栈的数据的一部分提供。 – 2010-11-03 03:07:33