在我的程序中,我试图修改 EIP 以指向包含 shell 代码的缓冲区基地址
例子:
0xbffff5f3 是栈上的地址,指向
code[80] = "\x90\x90\x90\x90\x90\x31\xc0\x31\xdb\x31\xc9\"
我创建了一个指针 ret
并使用堆栈框架知识将其指向缓冲区的基地址。
{
//Some more pointer arithmetic on ret
(*ret) = (int)code;
return ;
}
修改eip为
eip 0xbffff5f3 0xbffff5f3
这工作得很好,我的 shell 代码执行了。但是 ret
是用缓冲区地址硬编码的。
但是,现在我希望我的 shell 代码包含预先知道的缓冲区基地址,以便一旦缓冲区溢出,EIP 将指向它。
如何提前知道缓冲区的基地址?
[![缓冲区本身包含shellcode的地址][1]][1]
编辑:提炼我的问题: 给定一个静态声明的数组代码[80],我如何才能事先确定这个数组在堆栈上的基地址,以便我可以将这个基地址插入到我的 shell 代码中并插入适当的填充字节和 NOPS 以使 EIP 指向 shell代码?
我在网上看到了很多例子,都演示了使用GDB并在运行时计算缓冲区地址,但是如果我必须以编程方式导出shell代码地址,这是否可以实现。
最佳答案
没有直接的方法。您需要使用针对特定目标的技巧。 它们包括:
- 在没有地址空间随机化的相对静态程序中(或者如果模块是在没有重定位的情况下编译的,因此不能四处移动),您可以静态地猜测(例如:https://reverseengineering.stackexchange.com/questions/8504/problem-finding-return-address-for-shellcode)。
- 暴力破解所有可能的值,指望迟早会命中这一事实(未命中将仅仅是 DoSes,或者可能与服务器日志中的错误一样小,如果它例如重新启动有故障的部分)<
- 破坏代码中的其他实体而不是/除返回地址之外,使它们为您服务(例如:https://en.wikipedia.org/wiki/Return-to-libc_attack、corrupt
esp
) - use an additional recon attack使服务器向您发送线索
关于c - 查找缓冲区地址以创建 shell 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33696429/