程序不输出任何东西

Program doesnt output anything

我目前正在使用 C 进行缓冲区溢出。我只是一个初学者,所以请放轻松。

int main( ) {
 char *name[2];
 name[0] = "/bin/sh";
 name[1] = NULL;
 execve(name[0], name, NULL);
} 

这是我得到的输出: 好像我编译执行的时候,它切换到“/bin/sh”,这个输出是正常的还是我做错了什么?

#include <unistd.h> 

 int main(void) {
 char buf[7 + 1 + 4 + 4] = "/bin/sh<garbage>";

 *(buf + 7) = 0;
 *((char**)(buf + 8)) = buf;
 *((char**)(buf + 12)) = NULL;
 syscall(11, buf + 0, buf + 8, buf + 12);
}

对于这段代码,我被要求简要解释简化并 运行 它来解释输出。但是如屏幕截图所示,它根本不输出任何内容,我该如何解决?

it switches to "/bin/sh", is this output normal or am I doing something wrong?

是的,在这两种情况下你都执行 sh 所以提示符会改变,你可以输入命令,就像你在控制台中启动 sh .要完成 sh 执行,请输入 exit 或 control-d

it doesnt output anything at all

也就是说你没有进入sh

由于行

,第二个程序假设指针在 32b 上
*((char**)(buf + 8)) = buf;
 *((char**)(buf + 12)) = NULL;

如果你在 64b 中,它将无法按预期工作,强制在 32b 中编译。

如果您在 32b 中修改其定义,例如通过 syscall

打印值 return

当然可以修改程序以在 64b 上运行:

int main(void) {
 char buf[7 + 1 + 8 + 8] = "/bin/sh<garbage........>";

 *(buf + 7) = 0;
 *((char**)(buf + 8)) = buf;
 *((char**)(buf + 16)) = NULL;
 syscall(59, buf + 0, buf + 8, buf + 16);
}

如备注 11 所示,对于 x86(而 ARMv7 是我在 PI4 上的情况)和 59 对于 x86-64