You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

64位Linux缓冲区溢出:shell启动后立即终止的解决求助

缓冲区溢出Shell启动后立即退出的解决思路
  • 优化Payload,添加阻塞逻辑
    不要直接使用最简版的execve("/bin/sh") payload,在执行shell的系统调用前后加入阻塞代码。比如在execve后追加无限循环的机器码(x86下是\xeb\xfe),确保即使shell意外返回,进程也不会立刻终止。另外,构造payload时要确保stdin、stdout、stderr都绑定到当前终端,避免因为IO环境异常导致shell退出。

  • 在GDB内重定向程序IO到真实终端
    无需外部管道,直接在GDB中将程序的输入输出绑定到你的物理终端:

    1. 新开一个终端执行tty,得到终端路径(比如/dev/pts/1)
    2. 在GDB中启动程序时执行:
      run < /dev/pts/1 > /dev/pts/1 2>&1
      
      这样程序的IO直接对接真实终端,shell启动后不会因为GDB的管道环境而自动退出。
  • 调整GDB的进程跟踪参数
    当程序通过execve启动shell时,GDB默认会跟踪原进程,新shell进程会被自动detach导致父进程退出后被回收。修改GDB参数解决:

    set follow-fork-mode child
    set detach-on-fork off
    

    启动程序触发溢出后,执行continue,GDB会跟踪新的shell进程,此时可以直接在GDB中输入shell命令,或者切换到终端交互。

  • 强制跳转到漏洞函数(绕过主函数无argv限制)
    如果必须输入特定值才能进入漏洞函数,但主函数不处理argv,直接在GDB中跳转到漏洞函数:

    1. 用info functions找到漏洞函数的地址(比如0x08048472)
    2. 程序启动后执行:
      # 32位程序
      set $eip = 0x08048472
      # 64位程序
      set $rip = 0x400610
      
      跳过主函数的输入检查,直接进入漏洞函数。此时可以在外部用管道传入payload并保持shell:
      (python -c 'print "A"*100 + "payload"'; cat) | ./vuln_program
      

内容的提问来源于stack exchange,提问作者Mattia Russo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 15:38:28