我正在处理一个二进制文件。它有一个地址从123开始的函数。我需要让我的代码执行这个函数。
二进制文件接受大小为'n'的字节数组,不检查边界。整个任务实际上是溢出缓冲区并导致坏事发生。
同样,工作是调用地址123并让它执行。我的印象是,如果缓冲区大小为“4”,并且我传递了9个字符..,则会在堆栈中放置5个字符并执行。 (这是真的吗?)
另外,为了让我得到要执行的地址,我想说“拨打123”。据我所知,“电话”是“e8”,不是吗?
这个问题对我来说有点混乱。如果有人能帮助我更好地理解它,我会非常感激
(是的,这是一个家庭作业问题)
答案 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字节的操作码,这是不太可能找到的。