我目前在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);
}
答案 0 :(得分:0)
它切换到“ / bin / sh”,这是正常输出还是我做错了什么?
在两种情况下都可以执行 sh ,因此提示符会更改,并且可以输入命令,例如在控制台中启动 sh 一样。要完成 sh 执行,请输入 exit 或Control-d
它根本不输出任何东西
这意味着您不输入 sh
第二个程序假定指针由于行而在32b上
*((char**)(buf + 8)) = buf;
*((char**)(buf + 12)) = NULL;
如果您使用的是64b,则无法正常工作,请强制在32b中进行编译。
如果您使用的是32b,请修改其定义,例如打印 syscall
返回的值当然可以修改程序以在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(对于PI4,ARMv7是我的情况),对于x86-64,则为59