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

标签 exploit c shellcode

我正在对 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-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/

相关文章:

linux - LogWatch 报告的可能的 ^null$ 漏洞是什么?

c - 在 C 中执行 shellcode (visual studio 2017

C代码解释

C execve() 参数 [生成一个 shell 示例]

assembly - Strncat 复制到带有偏移量的目标

c - Ret2libc 漏洞在 gdb 中有效,但在正常 shell 中会出现错误 sh : 1: g:0:1: not found

c - 如何使用转发端口连接到远程bindshell

c - Linux,读取磁带设备

更改 char 指针数组中的字符串

c - 最简单的桥接示例不起作用 - Arduino Yun