我正在对 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 才会变为交互式。也就是说,如果我输入的第一个字符是 换行符
(\n
),那么 shell 将保持打开状态并变为交互式。
那么谁能解释一下这里发生了什么?
最佳答案
好的,我相信系统正在成功调用 /bin/sh
但它是使用 -c 标志调用它的。
尝试:
/bin/bash -c junk
这应该与您所看到的类似。您需要使用寄存器来设置系统调用,以便在不使用 -c 标志的情况下调用/bin/sh。
关于exploit - 为什么使用 system() 的 return-to-libc shell 会立即退出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28574088/