我目前是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中,请修改其定义,例如打印syscall返回的值