缓冲区溢出:在没有 'null terminator' (0x00) 的情况下以十六进制写入 7
Buffer overflows: writing 7 in hexadecimal without 'null terminator' (0x00)
我正在尝试利用缓冲区溢出漏洞来覆盖堆栈的 return 地址。
但是我尝试 'hack' 的代码使用了金丝雀系统。它始终将整数初始化为相同的硬编码值 7,并稍后检查该变量是否仍然相同。
我可以创建一个缓冲区溢出,我可以重写这个变量,但是我无法写入正确的值。缓冲区溢出是由于错误使用strcpy造成的。输入是通过文件的内容给出的,如下所示:
0000000: 6132 3334 3536 3738 395f 6232 3334 3536 a23456789_b23456
0000010: 3738 3907 00 789..
最后 2 个十六进制值 (07 00) 是我遇到问题的地方。 07 是我试图放置在变量中的值(它被放置在正确的内存位置)。但是我相信我需要在下一个位置写00,否则变量的值会大于7。
00 的问题在于它充当 strcpy 的空终止符,这意味着我无法在它之后提供更多信息,因此无法覆盖 return 地址。
这种情况是否可以克服,或者如果不使用 0x00 就不可能提供正确的值?
编辑:
代码(大多简写到点):
void getwd(char *path)
{
strcpy( path, mapped_path );
return path;
}
void pwd(void)
{
int canary = 7;
char path[MAXPATHLEN + 1];
if (getwd(path) == (char *) NULL)
{
printf("Couldn't get current directory!\n");
}
else
{
printf("Current directory = %s\n", path);
printf("max strlen(path) is %d, strlen(path) = %d\n", MAXPATHLEN-1, strlen(path));
printf("Canary should be 7. Canary = %d\n", canary);
if (canary != 7)
printf("ALERT: path[MAXPATHLEN + 1] has been overflowed!\n");
}
}
缓冲区溢出发生在 getwd 中,其中 mapped_path 大于路径。 mapped_path 到那时可以保存任何你想要的值。
您必须注入实际的 shellcode,以编程方式在此特定位置插入整数 7。
第一步是找到 return 地址并将其设置到缓冲区中的特定位置。
第二步是在预定义的位置放置一个无零的shellcode,让shellcode再次将变量设置为7。
零零 shellcode 不难写,因为有很多方法可以在不使用实际数字的情况下将变量清零,例如 xor eax, eax
(如果您熟悉汇编)。
如果您以前从未这样做过,那么实现这个目标可能需要很长时间。
我正在尝试利用缓冲区溢出漏洞来覆盖堆栈的 return 地址。
但是我尝试 'hack' 的代码使用了金丝雀系统。它始终将整数初始化为相同的硬编码值 7,并稍后检查该变量是否仍然相同。
我可以创建一个缓冲区溢出,我可以重写这个变量,但是我无法写入正确的值。缓冲区溢出是由于错误使用strcpy造成的。输入是通过文件的内容给出的,如下所示:
0000000: 6132 3334 3536 3738 395f 6232 3334 3536 a23456789_b23456
0000010: 3738 3907 00 789..
最后 2 个十六进制值 (07 00) 是我遇到问题的地方。 07 是我试图放置在变量中的值(它被放置在正确的内存位置)。但是我相信我需要在下一个位置写00,否则变量的值会大于7。
00 的问题在于它充当 strcpy 的空终止符,这意味着我无法在它之后提供更多信息,因此无法覆盖 return 地址。
这种情况是否可以克服,或者如果不使用 0x00 就不可能提供正确的值?
编辑:
代码(大多简写到点):
void getwd(char *path)
{
strcpy( path, mapped_path );
return path;
}
void pwd(void)
{
int canary = 7;
char path[MAXPATHLEN + 1];
if (getwd(path) == (char *) NULL)
{
printf("Couldn't get current directory!\n");
}
else
{
printf("Current directory = %s\n", path);
printf("max strlen(path) is %d, strlen(path) = %d\n", MAXPATHLEN-1, strlen(path));
printf("Canary should be 7. Canary = %d\n", canary);
if (canary != 7)
printf("ALERT: path[MAXPATHLEN + 1] has been overflowed!\n");
}
}
缓冲区溢出发生在 getwd 中,其中 mapped_path 大于路径。 mapped_path 到那时可以保存任何你想要的值。
您必须注入实际的 shellcode,以编程方式在此特定位置插入整数 7。
第一步是找到 return 地址并将其设置到缓冲区中的特定位置。
第二步是在预定义的位置放置一个无零的shellcode,让shellcode再次将变量设置为7。
零零 shellcode 不难写,因为有很多方法可以在不使用实际数字的情况下将变量清零,例如 xor eax, eax
(如果您熟悉汇编)。
如果您以前从未这样做过,那么实现这个目标可能需要很长时间。