C 查找缓冲区地址以创建外壳代码

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

在我的程序中,我试图修改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将指向它

如何提前知道缓冲区的基址

[![缓冲区本身包含外壳代码的地址][1][1]

编辑:优化我的问题: 给定一个静态声明的数组代码[80],如何在堆栈上确定此数组的基址,以便将此基址插入shell代码,并插入适当的填充字节和NOP,使EIP指向shell代码


我在互联网上看到了很多例子,所有这些例子都演示了如何使用GDB并在运行时计算缓冲区地址,但是如果我必须以编程方式导出的外壳代码地址,这是可以实现的。

没有直接的方法。你需要使用特定于目标的技巧。 这些措施包括:

  • 在没有地址空间随机化的相对静态程序中(或者如果模块在编译时没有重新定位,因此无法移动),您可以静态猜测(示例:)
  • 暴力强制所有可能的值,取决于您迟早会命中的事实(如果重新启动故障部件,则未命中仅为剂量或可能与服务器日志中的错误一样小)
  • 损坏代码中的其他实体,而不是/除了返回地址,以使它们为您的事业服务(示例:,)
  • 这会让服务器向您发送线索

我不认为您可以将字符串转换为那样的指针。@swiley C中的字符串只是一个字符数组。