在问题之前,这纯粹是为了分配,我不打算以其他方式错误地访问不安全的程序。
我有一个涉及溢出输入字符串的任务,以便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 位运行。我在问如何执行附加指令,因为第一个问题的地址不变,但后面的问题的地址添加了随机值。