2013-04-25 78 views
0

我一直試圖在shab6.x中使用SHA-256函數在FreeBSD 9.1系統上,但它似乎破壞了我的程序的內存空間,導致各種躁狂行爲。我寫了一個快速程序,只是爲了玩這些功能,仍然有問題。SHA_256函數破壞內存空間

在下面的例子,INT I當我打電話SHA256_Init()被改變時,從周圍的printf()的語句所示的輸出。

這就是我運行代碼。

$ ./miner "hello world" 
i = 0 
i = 32 
0000000032  9010a9cf81ce2c28a642fd03ddf6da5790c65c30cd4a148c4257d3fe488bacc7 

爲什麼這個值變爲32?我錯過了什麼嗎?代碼如下...

#include <sha256.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/types.h> 

#define DIFFICULTY 0 

int main(int argc, const char **argv) { 
    uint nonce, i, j; 
    SHA256_CTX ctx; 
    size_t arglen; 
    unsigned char digest[32]; 
    char * data; 

    if(argc < 1) exit(1); 
    arglen = strlen(argv[1]); 
    data = malloc(arglen + 1); 
    char digestStr[65]; 
    i = 0; 
    do { 
     nonce = i; 
     strncpy(data, argv[1], arglen + 1); 

     printf("i = %i\n", i); 
     SHA256_Init(&ctx); 
     printf("i = %i\n", i); 

     SHA256_Update(&ctx, data, arglen); 
     SHA256_Update(&ctx, (unsigned char *) &nonce, sizeof(nonce)); 
     SHA256_Final(digest, &ctx); 
     SHA256_End(&ctx, digestStr); 
     printf("%010i\t%s\n", i, digestStr); 

     j = 0; 
     while(j < 32 && digest[j] == '\0') { 
      j++; 
     } 
     i++; 
    } while(j < DIFFICULTY); 

    free(data); 
    return 0; 
} 
+0

「SHA_256函數」或您的代碼中的錯誤? - 我知道我的錢在哪裏...... – 2013-04-25 02:57:45

+0

我從來沒有說過SHA265的功能是問題,只是他們似乎在破壞存儲空間。無論是因爲我把指針擰在某個地方,都是無關緊要的。它非常簡單的代碼,我在問,因爲以前使用過這些函數的人可能熟悉我不熟悉的東西,或者快速地找出我的代碼中的一些錯誤,我錯過了。顯然有些東西在這裏是錯誤的,因爲函數的工作原理和內存通常不會重寫自己......呃,除非這是一個更大的問題;) – user1842941 2013-04-25 03:16:12

+0

我不知道是什麼原因導致你的錯誤,但你應該檢查'if argc <2)',你應該使用'%u'來''printf''uint'。 – 2013-04-25 04:39:42

回答

1

我剛剛有這個完全相同的問題,並解決了它。

的問題是,你要包括在你的代碼比你到你的應用程序連接使用SHA2庫不同的頁眉。

在我的情況下,SHA256_CTX結構在openSSL庫中是不同的大小。 openSSL庫的結構比文件中的結構長度大8個字節。

函數SHA256_Init(& ctx)在SHA256_CTX結構上執行一個memset,然後在結構之後破壞8個額外的隨機字節。我之所以說是隨機的,是因爲它會在發佈版本與調試版本中做不同的事情,因爲優化編譯器會移動你的變量。