libcrypto ( munmap_chunk(): invalit pointer )



  • hallo,

    ich bekomme bei meinem code keinen compiler-fehler, jedoch bricht das programm beim verschlüsselungsabschnitt (openssl - libcrypto) ab.

    es liegt so wie ich es sehe an der umwandlung in unsigned char* (ukey, uiv)

    bitte um hilfe. thx

    ------------
    *** glibc detected *** ./probatur: munmap_chunk(): invalid pointer: 0x0804d050 ***
    ======= Backtrace: =========
    /lib/libc.so.6[0xb7cb42f7]
    /usr/lib/libcrypto.so.0.9.8(CRYPTO_free+0x36)[0xb7eb6d96]
    /usr/lib/libcrypto.so.0.9.8(EVP_MD_CTX_cleanup+0x8a)[0xb7f1d1eb]
    /usr/lib/libcrypto.so.0.9.8[0xb7f19f0a]
    /usr/lib/libcrypto.so.0.9.8(RAND_bytes+0x3c)[0xb7f1a587]
    ./probatur[0x804ab0a]
    ./probatur(__gxx_personality_v0+0x304)[0x80495e4]
    /lib/libc.so.6(__libc_start_main+0xdc)[0xb7c67824]
    ./probatur(__gxx_personality_v0+0x51)[0x8049331]
    ======= Memory map: ========
    08048000-0804c000 r-xp 00000000 03:04 8696 /home/ts0/Projects/probatur/src/probatur
    0804c000-0804d000 rw-p 00004000 03:04 8696 /home/ts0/Projects/probatur/src/probatur
    0804d000-0806e000 rw-p 0804d000 00:00 0 [heap]
    b7c4d000-b7c4e000 rw-p b7c4d000 00:00 0
    b7c4e000-b7c50000 r-xp 00000000 03:03 2516982 /lib/libdl-2.5.so
    b7c50000-b7c52000 rw-p 00001000 03:03 2516982 /lib/libdl-2.5.so
    b7c52000-b7d6e000 r-xp 00000000 03:03 2516479 /lib/libc-2.5.so
    b7d6e000-b7d6f000 r--p 0011c000 03:03 2516479 /lib/libc-2.5.so
    b7d6f000-b7d71000 rw-p 0011d000 03:03 2516479 /lib/libc-2.5.so
    b7d71000-b7d75000 rw-p b7d71000 00:00 0
    b7d75000-b7d7e000 r-xp 00000000 03:03 2252651 /usr/lib/gcc/i686-pc-linux-gnu/4.1.2/libgcc_s.so.1
    b7d7e000-b7d7f000 rw-p 00008000 03:03 2252651 /usr/lib/gcc/i686-pc-linux-gnu/4.1.2/libgcc_s.so.1
    b7d7f000-b7da1000 r-xp 00000000 03:03 2516965 /lib/libm-2.5.so
    b7da1000-b7da3000 rw-p 00021000 03:03 2516965 /lib/libm-2.5.so
    b7da3000-b7e75000 r-xp 00000000 03:03 2252652 /usr/lib/gcc/i686-pc-linux-gnu/4.1.2/libstdc++.so.6.0.8
    b7e75000-b7e78000 r--p 000d1000 03:03 2252652 /usr/lib/gcc/i686-pc-linux-gnu/4.1.2/libstdc++.so.6.0.8
    b7e78000-b7e7a000 rw-p 000d4000 03:03 2252652 /usr/lib/gcc/i686-pc-linux-gnu/4.1.2/libstdc++.so.6.0.8
    b7e7a000-b7e80000 rw-p b7e7a000 00:00 0
    b7e80000-b7f94000 r-xp 00000000 03:03 2715089 /usr/lib/libcrypto.so.0.9.8
    b7f94000-b7fa9000 rw-p 00113000 03:03 2715089 /usr/lib/libcrypto.so.0.9.8
    b7fa9000-b7fac000 rw-p b7fa9000 00:00 0
    b7fc7000-b7fc9000 rw-p b7fc7000 00:00 0
    b7fc9000-b7fe3000 r-xp 00000000 03:03 2517150 /lib/ld-2.5.so
    b7fe3000-b7fe4000 r--p 00019000 03:03 2517150 /lib/ld-2.5.so
    b7fe4000-b7fe5000 rw-p 0001a000 03:03 2517150 /lib/ld-2.5.so
    bffa8000-bffbe000 rw-p bffa8000 00:00 0 [stack]
    ffffe000-fffff000 r-xp 00000000 00:00 0 [vdso]

    ----------------------------------

    source code
    ---------------

    string CRYPT::encrypt(string key, string iv) {
      EVP_CIPHER_CTX *ctx;
    	unsigned char * ukey = reinterpret_cast<unsigned char*> ((char*) key.c_str());
    	unsigned char * uiv = reinterpret_cast<unsigned char*> ((char*) iv.c_str());
    
      RAND_bytes(ukey, EVP_MAX_KEY_LENGTH);
      RAND_bytes(uiv, EVP_MAX_IV_LENGTH);
      if (!(ctx = (EVP_CIPHER_CTX *)malloc(sizeof(EVP_CIPHER_CTX)))) return 0;
      EVP_CIPHER_CTX_init(ctx);
      EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), 0, ukey, uiv);
    	cout << ctx << endl;
    }
    

    --------------

    thx



  • std::basic_string<char>::c_str gibt nicht umsonst einen Pointer auf konstante Char zurück! Wenn du das nun einfach ignorierst, kommst du zu Recht in Teufelsküche!

    Außerdem gibst du den reservierten Speicher gar nicht frei! (und return 0; bei Rückgabewert string sollte auch nicht gehen!)



  • hallo, danke für die antwort.

    habe nun folgendes gemacht...

    string CRYPT::encrypt(string key, string iv) {
    	EVP_CIPHER_CTX *ctx;
    	unsigned char* ukey = new unsigned char[ key.size() ];
    	memcpy(ukey, key.c_str(), key.size());
    	unsigned char* uiv = new unsigned char[ iv.size() ];
    	memcpy(uiv, iv.c_str(), iv.size());
    
      	/* This uses the OpenSSL PRNG .  See Recipe  11.9 */ 
      	RAND_bytes(ukey, EVP_MAX_KEY_LENGTH);
      	RAND_bytes(uiv, EVP_MAX_IV_LENGTH);
      	if (!(ctx = (EVP_CIPHER_CTX *)malloc(sizeof(EVP_CIPHER_CTX)))) exit(1);
      	EVP_CIPHER_CTX_init(ctx);
      	EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), 0, ukey, uiv);
    	cout << ctx << endl;
    }
    

    da ich den gleichen fehler bekomme bin ich wohl komplett auf dem holzweg...

    unsigned char* ukey = new unsigned char[ key.size() ];
    	memcpy(ukey, key.c_str(), key.size());
    	unsigned char* uiv = new unsigned char[ iv.size() ];
    	memcpy(uiv, iv.c_str(), iv.size());
    

    hat jmd nen konkreten ansatz zu nem lösungsweg? 😕

    mfg


Anmelden zum Antworten