【发布时间】: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运行它。