2tr*_*ill 4 c memory hash openssl
我正在使用openssl的libcrypto库来尝试创建一个任意输入缓冲区的sha256哈希值,但是当我将null终止哈希缓冲区以使其成为一个C字符串时它会崩溃,但只有在使用动态内存返回时才会崩溃,malloc但是当我静态使用时像这个例子中分配的内存:使用openssl和C++生成sha256.我正在分配65个字节,就像示例一样,正如length打印的值所示.那么为什么null在使用动态内存而不是静态内存时会终止缓冲区崩溃?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <openssl/sha.h>
static int sha256(char *in, char **out)
{
int rtrn, i;
SHA256_CTX sha256;
unsigned char hash[SHA256_DIGEST_LENGTH];
rtrn = SHA256_Init(&sha256);
if(rtrn < 0)
{
printf("Sha Init Error\n");
return -1;
}
rtrn = SHA256_Update(&sha256, in, strlen(in));
if(rtrn < 0)
{
printf("Sha Update Error\n");
return -1;
}
rtrn = SHA256_Final(hash, &sha256);
if(rtrn < 0)
{
printf("Sha Final Error\n");
return -1;
}
*out = malloc((SHA256_DIGEST_LENGTH * 2) + 1);
if(*out == NULL)
{
printf("Can't allocate output buf\n");
return -1;
}
for(i = 0; i < SHA256_DIGEST_LENGTH; i++)
{
sprintf(*out + (i * 2), "%02x", hash[i]);
}
printf("Length: %d\n", (SHA256_DIGEST_LENGTH * 2) + 1);
*out[64] = '\0';
return 0;
}
int main(void)
{
int rtrn;
char *input = "3r98h932hr934hor";
char *output;
rtrn = sha256(input, &output);
if(rtrn < 0)
{
printf("Sha256\n");
return -1;
}
printf("%s\n", output);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我怀疑这是因为你不是故意的:
*out[64] = '\0';
Run Code Online (Sandbox Code Playgroud)
反而:
(*out)[64] = '\0';
Run Code Online (Sandbox Code Playgroud)
数组subscripting([])的优先级高于*C中的indirection()运算符,所以你写的相当于:
*(out[64]) = '\0';
Run Code Online (Sandbox Code Playgroud)
这将破坏堆栈上的随机区域(char **生命所在的地方).
| 归档时间: |
|
| 查看次数: |
580 次 |
| 最近记录: |