首页 > 解决方案 > 程序不输出任何东西

问题描述

我目前正在使用 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);
}

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

标签: cbufferbuffer-overflow

解决方案


它切换到“/bin/sh”,这个输出是正常的还是我做错了什么?

是的,在这两种情况下,您都执行sh以使提示发生变化,并且您可以输入命令,就像您在控制台中启动sh一样。要完成sh执行,请输入exit或 control-d

它根本不输出任何东西

这意味着你没有进入sh

第二个程序假设指针在 32b 上,因为这些行

*((char**)(buf + 8)) = buf;
 *((char**)(buf + 12)) = NULL;

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

如果您在 32b 中修改其定义,例如打印系统调用返回的值


当然可以修改程序以在 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


推荐阅读