使用输入字符串和ret、x86的溢出攻击

使用输入字符串和ret、x86的溢出攻击,x86,buffer-overflow,X86,Buffer Overflow,在提出问题之前,这纯粹是为了一项任务,我不打算以其他方式错误地访问不安全的程序 我有一个任务,它涉及到输入字符串溢出,因此ret指令将我发送到我想去的某个地址。字符串的最大值应为32字节,因此如果我用32字节的垃圾填充它,然后再填充4字节的垃圾,然后再填充4字节的我要访问的地址,那么我操纵了程序以调用错误的函数。我在32之后填充4字节垃圾的原因是溢出字符串的函数的结尾如下: 8048bc9: e8 3c ff ff ff call 8048b0a <Gets> 8048bce

在提出问题之前,这纯粹是为了一项任务,我不打算以其他方式错误地访问不安全的程序

我有一个任务,它涉及到输入字符串溢出,因此
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
8048bc9:e8 3c ff ff ff呼叫8048b0a
8048bce:b8 01 00 mov$0x1,%eax
8048bd3:c9离开
8048bd4:c3 ret
是填充字符串的内容。如果我理解正确,在
离开期间,4个字节的垃圾被弹出到
%ebp
,然后我的4个字节被
ret
执行,基本上是跳转到我想去的函数

这足以解决简单的问题,但在某些情况下,我应该在使用
ret
跳到我想跳的地方之前执行额外的代码。我对ret的理解不够透彻,无法做到这一点。如果我想说将
%eax
设置为某个值(例如0x12345678),那么从仍然必须跳转到错误函数的
ret
指令如何实现这一点


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

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


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

您必须通过一小段代码,将
eax
设置为某个值,然后让该代码跳转到实际函数。32字节的缓冲区应该足以容纳这段代码。@harold,所以我会让
ret
指向32字节字符串中的某个地方,然后把代码放在那里?那是放代码最方便的地方,反正你在放东西。缓冲区的地址是已知的,对吗?我肯定能找到,谢谢you@asimes是的,当然。您需要找到一段跳入损坏的缓冲区的代码。例如,如果调试会话在
ret
时显示缓冲区的地址存在于
EBX
中,则需要将该
ret
指向执行
jmp EBX
调用EBX
的代码段。当然,事情可能比这更复杂。。。