在GDB中跳转到内存会导致SIGSEGV

时间:2012-09-25 23:00:13

标签: assembly gdb code-injection

我正在尝试使用GDB将代码注入正在运行的进程中,并且每次尝试运行我的代码时都会收到SIGSEGV。我在ubuntu(Oneiric)。我使用python脚本将代码导出到环境变量中,然后从gdb中找到所需的代码,如x/50s *((char**)environ),然后选择一个更好的地址来检查来自的指令。

因此,当我执行x/30i *(addressOfCode)时,程序集指令与我想要运行的程序完全匹配。所以,如果我在代码的起点插入断点,跳转到stepi,我会得到一个段错误。此外,如果我在内存中选择一个位置并插入一些NOP,在其中一个中断,跳转到它,并且stepi,我也会得到一个段落错误。

我该如何避免这种情况?我是否因为我跳出指定的内存而进行了分类?我有什么选择来解决这个问题?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

  

我是否因为跳出指定的内存而进行了分类?

我不知道上述陈述的含义。没有“指定的过程记忆”这样的东西。

最有可能的是,你得到SIGSEGV,因为你没有可执行堆栈(Linux上的环境变量和许多其他UNIX变种都在堆栈上传递)。

如果您使用的是Linux,请尝试使用gcc main.c ... -Wl,-z,execstack进行关联。如果这使得代码注入工作,那么非可执行堆栈确实是你的问题。