C 查找缓冲区地址以创建外壳代码
在我的程序中,我试图修改EIP以指向包含shell代码的缓冲区基址 例如: 0xbffff5f3是堆栈上指向C 查找缓冲区地址以创建外壳代码,c,linux,stack,shellcode,stack-frame,C,Linux,Stack,Shellcode,Stack Frame,在我的程序中,我试图修改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
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将指向它
如何提前知道缓冲区的基址
[![缓冲区本身包含外壳代码的地址][1][1]
编辑:优化我的问题:
给定一个静态声明的数组代码[80],如何在堆栈上确定此数组的基址,以便将此基址插入shell代码,并插入适当的填充字节和NOP,使EIP指向shell代码
我在互联网上看到了很多例子,所有这些例子都演示了如何使用GDB并在运行时计算缓冲区地址,但是如果我必须以编程方式导出的外壳代码地址,这是可以实现的。没有直接的方法。你需要使用特定于目标的技巧。 这些措施包括:
- 在没有地址空间随机化的相对静态程序中(或者如果模块在编译时没有重新定位,因此无法移动),您可以静态猜测(示例:)
- 暴力强制所有可能的值,取决于您迟早会命中的事实(如果重新启动故障部件,则未命中仅为剂量或可能与服务器日志中的错误一样小)
- 损坏代码中的其他实体,而不是/除了返回地址,以使它们为您的事业服务(示例:,)
- 这会让服务器向您发送线索