c - 程序不输出任何东西
问题描述
我目前正在使用 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);
}
解决方案
它切换到“/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
推荐阅读
- swift - AVPlayer 淡入
- ms-access - MS-Access - 从父表单创建新的子记录并自动填充外键
- swift - 如何使元组类型快速符合协议?
- machine-learning - 如何确定 RetinaNet 模型的锚大小?
- r - 从 R 中的数据图中查找百分比
- java - 使用 while 循环创建用户界面
- view - 当 map 函数在 couchbase 视图中为某个文档运行时,是否可以通过 id 获取另一个文档中包含的数据?
- python-2.7 - 提供了密钥和iv,加密后我得到不同的值,然后是预期的
- python-3.x - 如何在 Python 中告诉客户端服务器中不存在文件
- php - 如何查看特定网页上的上次访问日期?我想在该页面上显示 7 天后过期的链接