3

在问题之前,这纯粹是为了分配,我不打算以其他方式错误地访问不安全的程序。

我有一个涉及溢出输入字符串的任务,以便ret指令将我发送到我想去的某个地址。该字符串预计最多 32 个字节,所以如果我用 32 个字节的垃圾填充它,然后是另外 4 个字节的垃圾,然后是我要访问的地址的 4 个字节,那么我操纵程序调用了错误的函数。我在 32 之后填充 4 个字节的垃圾的原因是因为溢出字符串的函数结束如下:

8048bc9: e8 3c ff ff ff     call 8048b0a <Gets>
8048bce: b8 01 00 00 00     mov $0x1,%eax
8048bd3: c9                 leave  
8048bd4: c3                 ret

<Gets>是填充字符串的内容。如果我理解正确,那么 4 个字节的垃圾会在%ebp期间弹出leave,然后我的 4 个字节ret基本上是作为跳转到我想去的函数执行的。

这足以解决简单的问题,但在某些情况下,我应该在跳转到我想要的地方之前执行额外的代码ret。我不太了解ret这样做。如果我想说设置%eax为某个值(例如 0x12345678),这怎么可能来自ret仍然必须跳转到错误函数的指令?

如果这很重要,它会以 32 位运行。我在问如何执行附加指令,因为第一个问题的地址不变,但后面的问题的地址添加了随机值。

4

1 回答 1

0

正如哈罗德所提到的,解决方案是让返回函数将我发送到我的字符串缓冲区的开头。

这可以通过溢出 40 个字节(这是 32 位 x86)的字符串缓冲区来完成,这样前 32 个字节在字符串缓冲区中,4 个由leave指令弹出,最后 4 个由ret指令执行。目标是使最后 4 个字节成为我的字符串缓冲区的地址,以小端形式。在ret指令执行完这 4 个字节后,我的机器代码开始从字符串缓冲区的开头执行。

于 2013-04-16T15:12:02.560 回答