【问题标题】:Jump to memory in GDB causes SIGSEGV在 GDB 中跳转到内存导致 SIGSEGV
【发布时间】:2012-09-25 23:00:12
【问题描述】:

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

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

我怎样才能避免这种情况?我是否只是因为我跳出了进程的指定内存而出现了段错误?我有什么办法可以解决这个问题?

感谢您的帮助!

【问题讨论】:

    标签: assembly gdb code-injection


    【解决方案1】:

    我是否只是因为我跳出进程的指定内存而出现了段错误?

    我不知道上面的陈述是什么意思。没有“进程指定内存”之类的东西。

    很可能,您收到 SIGSEGV 是因为您没有可执行堆栈(Linux 和许多其他 UNIX 变体上的环境变量在堆栈上传递)。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-14
      • 1970-01-01
      • 2017-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-06
      • 1970-01-01
      相关资源
      最近更新 更多