64位Linux缓冲区溢出:shell启动后立即终止的解决求助
缓冲区溢出Shell启动后立即退出的解决思路
优化Payload,添加阻塞逻辑
不要直接使用最简版的execve("/bin/sh")payload,在执行shell的系统调用前后加入阻塞代码。比如在execve后追加无限循环的机器码(x86下是\xeb\xfe),确保即使shell意外返回,进程也不会立刻终止。另外,构造payload时要确保stdin、stdout、stderr都绑定到当前终端,避免因为IO环境异常导致shell退出。在GDB内重定向程序IO到真实终端
无需外部管道,直接在GDB中将程序的输入输出绑定到你的物理终端:- 新开一个终端执行
tty,得到终端路径(比如/dev/pts/1) - 在GDB中启动程序时执行:
这样程序的IO直接对接真实终端,shell启动后不会因为GDB的管道环境而自动退出。run < /dev/pts/1 > /dev/pts/1 2>&1
- 新开一个终端执行
调整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中跳转到漏洞函数:- 用
info functions找到漏洞函数的地址(比如0x08048472) - 程序启动后执行:
跳过主函数的输入检查,直接进入漏洞函数。此时可以在外部用管道传入payload并保持shell:# 32位程序 set $eip = 0x08048472 # 64位程序 set $rip = 0x400610(python -c 'print "A"*100 + "payload"'; cat) | ./vuln_program
- 用
内容的提问来源于stack exchange,提问作者Mattia Russo
相关产品推荐
相关产品推荐

