堆溢出攻击,这段代码会出什么问题
Heap Overflow attack, what can go wrong with this code
char *test(char *arg1, char* arg2){
size_t length=strlen(arg1);
char *c= malloc(length+4);
for(int i=length;i>0;i--)
*(c+i+4)=*(arg1)^(arg2[i%8]);
*(size_t *) (c) =length;
return c;
}
此代码是否遭受堆溢出攻击?
很多事情都可能出错。最重要的是,表达式 *(c+i+4)=*(arg1)^(arg2[i%8])
将在循环的第一次迭代中溢出您分配的缓冲区。
想象一下 length==1
。因此,您将为 c
分配 5 个字节。第一次循环时,i
等于 1。因此表达式 c+i+4
解析为 c+5
,超出您分配的内存一个字节。
其他可能出错的事情:
arg1
是无效指针。你的程序崩溃了。
arg1
引用的字符串很长,无法为其分配足够的内存。 malloc
失败,您的程序崩溃。
arg2
寻址的内存小于 8 个字节,因此您的代码正在读取超出分配的内存。这可能不会崩溃,但结果将是......未定义。
- 您假设
size_t
是 4 个字节。您的 malloc
应该是 malloc(length+sizeof(size_t))
.
char *test(char *arg1, char* arg2){
size_t length=strlen(arg1);
char *c= malloc(length+4);
for(int i=length;i>0;i--)
*(c+i+4)=*(arg1)^(arg2[i%8]);
*(size_t *) (c) =length;
return c;
}
此代码是否遭受堆溢出攻击?
很多事情都可能出错。最重要的是,表达式 *(c+i+4)=*(arg1)^(arg2[i%8])
将在循环的第一次迭代中溢出您分配的缓冲区。
想象一下 length==1
。因此,您将为 c
分配 5 个字节。第一次循环时,i
等于 1。因此表达式 c+i+4
解析为 c+5
,超出您分配的内存一个字节。
其他可能出错的事情:
arg1
是无效指针。你的程序崩溃了。arg1
引用的字符串很长,无法为其分配足够的内存。malloc
失败,您的程序崩溃。arg2
寻址的内存小于 8 个字节,因此您的代码正在读取超出分配的内存。这可能不会崩溃,但结果将是......未定义。- 您假设
size_t
是 4 个字节。您的malloc
应该是malloc(length+sizeof(size_t))
.