使用输入字符串和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
的代码段。当然,事情可能比这更复杂。。。