为什么使用system()返回libc shell会立即退出?

Sey*_*mad 7 c exploit shellcode

我正在试验对Linux上用C编写的程序的控制流劫持攻击.我正在尝试对启用了No-eXecutable-stack对策的程序执行简单的ret-2-libc攻击.为此,我将返回system()带参数的函数/bin/sh.

但是我遇到了一个问题:虽然我的攻击有效并且shell成功生成,但是在进入第一个角色后shell立即退出!也就是说,按下任意键后shell关闭!

在这个简单的C代码中也可以观察到这种行为:

int main() { system("/bin/sh"); return 0; }
Run Code Online (Sandbox Code Playgroud)

我用它编译它: gcc code.c -o system

为什么是这样?我该如何解决?

我在尝试Ubuntu-9.04使用kernel 2.6.28glibc-2.9-1


更新:当且仅当我按下的第一个键时,shell才会变为交互式Enter.也就是说,如果我输入的第一个字符是a new-line(\n),那么shell将保持打开状态并变为交互式.

所以有人能解释这里发生了什么吗?

Mo *_*igi -1

好的,我相信系统已成功调用/bin/sh,但它使用 -c 标志来调用它。

尝试:

/bin/bash -c junk
Run Code Online (Sandbox Code Playgroud)

这应该与您所看到的类似。您需要使用寄存器来设置系统调用,以便在不使用 -c 标志的情况下调用 /bin/sh 。