我有一个易受缓冲区溢出影响的 32 位 linux 二进制文件。我发现我需要输入 1040 个字节才能控制 EIP 寄存器。
我的 shellcode 大小为 28 个字节。如何安排这个输入来填充缓冲区,插入我的 shellcode,并将 EIP 设置为 shellcode 第一个字节的地址?
我尝试在 1040-28 字节处插入 shellcode,然后是地址,但这不起作用。
我有一个易受缓冲区溢出影响的 32 位 linux 二进制文件。我发现我需要输入 1040 个字节才能控制 EIP 寄存器。
我的 shellcode 大小为 28 个字节。如何安排这个输入来填充缓冲区,插入我的 shellcode,并将 EIP 设置为 shellcode 第一个字节的地址?
我尝试在 1040-28 字节处插入 shellcode,然后是地址,但这不起作用。
这里的目标是eip指出你的 shellcode。有很多方法可以做到这一点。第一件事是检查你的 shellcode 是否放在寄存器中。如果发生这种情况,那么您可以通过找到一个可以让您返回该寄存器的小工具来执行 ret2reg(返回到寄存器)(例如call reg等...)。另一种方法是使用 nopsled - 但这不是那么稳定。在这种情况下,您的有效负载可能是:
nops + shellcode + (1040 -len(nops+shellcode))*"A" + pack32(a_nop_address)
但请记住,上述有效负载中的“a_nop_address”会在内部发生变化,并且在启用gdb的情况下将不稳定。aslr当然,上述所有方法都假定您的堆栈是可执行的。另一种方法是使用一个包含你的 shellcode 的shell 变量,然后eip指向那个地址。最后,还有更高级的方法,如ret2libc、ret2plt、ROP 等,它们甚至不使用 shellcode 来弹出 shell,还可以帮助绕过一些安全缓解措施,如 aslr 和不可执行堆栈。