为啥使用 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/sh
的system()
函数。
但是我有一个问题:虽然我的攻击有效并且成功生成了一个shell,但是shell在输入第一个字符后立即退出!也就是说,我按下任意键后,shell 就会关闭!
在这个简单的 C 代码中也可以观察到这种行为:
int main() system("/bin/sh"); return 0;
我编译它使用:gcc code.c -o system
这是为什么呢?我该如何解决?
我正在用kernel 2.6.28
和glibc-2.9-1
对Ubuntu-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