有一个我正在处理的二进制文件。它有一个地址从123开始的函数。我需要我的代码来执行这个函数。
二进制文件接受大小为'n‘的字节数组,并且不检查边界。整个任务实际上是使缓冲区溢出并导致不好的事情发生。
同样,任务是调用地址123并让它执行。我的印象是,如果缓冲区大小是"4",并且我传递了9个字符..,那么5个字符将被放入堆栈并执行。(这是真的吗?)
此外,为了让我找到要执行的地址,我想说"call 123“。据我所知,"call“是"e8",不是吗?
这个问题对我来说有点困惑。如果有人能帮助我更好地理解它,我将不胜感激
(是的,这是一个家庭作业问题)
发布于 2010-11-03 10:19:13
我强烈建议您阅读Smashing the Stack for Fun and Profit。它非常详细地描述了执行此操作所需的步骤。
发布于 2010-11-03 10:38:48
堆栈不包含代码,但包含函数的返回地址。典型的堆栈结构是:
<stack data> <old frame pointer> <return address><old frame pointer>有时会被省略,我认为必须这样做,所以您只需提供填充数组的数据,然后再提供123。
发布于 2010-11-03 10:50:14
一种常见的策略是在固定的存储器地址中找到call ESP操作码,并用该地址重写返回地址。这样,执行将在堆栈上继续。如果没有激活(或支持) DEP,它将工作。
在您的例子中,您还可以在内存中查找abs_jump 123。
编辑:@Loren它只有在堆栈可以执行的情况下才能工作。call esp只有两个字节的操作码,所以很有可能在内存中的某个地方找到它。第二种方法不执行堆栈中的代码,但需要一个5字节的操作码,这是很难找到的。
https://stackoverflow.com/questions/4083745
复制相似问题