为啥使用 system() 的 return-to-libc shell 会立即退出?

Posted

技术标签:

【中文标题】为啥使用 system() 的 return-to-libc shell 会立即退出?【英文标题】:Why return-to-libc shell using system() exits immediately?为什么使用 system() 的 return-to-libc shell 会立即退出? 【发布时间】:2015-04-18 21:24:17 【问题描述】:

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

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

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

int main()  system("/bin/sh"); return 0; 

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

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

我正在用kernel 2.6.28glibc-2.9-1Ubuntu-9.04 进行试验


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

那么谁能解释一下这里发生了什么?

【问题讨论】:

鉴于您可以使用标准和合法的 C 代码重现该问题,这表明这与您的漏洞利用尝试无关,因此该问题更适合 Stack Overflow。 @AndréDaniel True;但这与一般的编程问题不太一样,shellcode 开发领域的专家可以提供更好的帮助。所以我在这里问了。 我无法用您的代码重现它。这真的是你在那里做的唯一事情吗?你是怎么执行的? @StenSoft 是的,就是这样。我将该代码保存在一个文件中,使用我提到的命令对其进行编译,然后使用./system 运行它。 【参考方案1】:

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

试试:

/bin/bash -c junk

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

【讨论】:

以上是关于为啥使用 system() 的 return-to-libc shell 会立即退出?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我使用此 WinRT 代码得到“'System.Array' 不包含 'AsBuffer' 的定义”?

(关于最佳实践的问题)为啥默认情况下“使用 System.Text”?

为啥 xmlignore 不能与 System.Timers.Timer 类一起使用

为啥要使用using System.Collections.Generic

为啥使用 System.Text.Json 的 JSON 反序列化这么慢?

为啥使用 system() 的 return-to-libc shell 会立即退出?