在 JNI Android 的 C++ 中使用 memset 时检测到堆栈损坏

stack corruption detected when use memset in c++ from JNI Android

我正在使用 C++ 本机代码开发 Android 应用程序。

我有 C++ 代码(C++ 本机中的 XTTEA 算法),它可以与 C++ 编译器完美地在线运行,我可以获得输出,但是当我尝试使用 JNI cpp class 方法时 class,它给我以下错误:

A/libc: stack corruption detected (-fstack-protector)
A/libc: Fatal signal 6 (SIGABRT), code -1 (SI_QUEUE) in tid 13328 (example.ndkdemo), pid 13328 (example.ndkdemo)

下面是我将数据作为输入传递的 JNI cpp 代码。

extern "C" JNIEXPORT jint JNICALLJava_com_example_ndkdemo_MainActivity_encryptDataInt(JNIEnv *env, jobject thiz /* this */){
//    return add(5,3);

    int len;

    unsigned char input[8] = { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11 };

    sg_xxtea_encrypt (input, 8);

    return 1;
}

下面是我从上面的 JNI 代码调用的方法。我调试代码,发现错误发生在第一个 if 条件内的 memset() 函数中。

int
sg_xxtea_encrypt (unsigned char *data, int data_size)
{
    int i = 0;
    int block_size = ((data_size + 2) / 4 + 1) * 4;
    memset (sg_data_buff, 0, ENCRYPT_INT_BUFF * 4);

    if (block_size > data_size)
    {
        memset (&data[data_size], 0, block_size - data_size); // We get error in this line
    }
    for (i = data_size + 1; i >= 2; i--)
    {
        data[i] = data[i - 2];
    }
    data[0] = (data_size >> 8) & 0xff;
    data[1] = (data_size >> 0) & 0xff;
    for (i = 0; i < block_size / 4; i++)
    {
        sg_data_buff[i] = bytesTOint (&data[i * 4]);
    }
    TEA_EncryptCore (block_size, sg_data_buff, sg_key_buff);
    for (i = 0; i < block_size / 4; i++)
    {
        intTobyte (sg_data_buff[i], &data[i * 4]);
    }
    return block_size;
}

任何人都可以建议可能是什么问题。

您的 input 数组是 8 个字节。 data参数是指向input的指针,data_size参数是8,所以block_size变量计算为12。你的memset()写的是4 0x00 字节到 &data[data_size],又名 &input[8],超出了 input 数组的范围。因此,缓冲区溢出破坏了 input 数组周围的堆栈内存。

memset() 之后的后续 for 循环也在越界访问 input 数组的元素。

input 是固定大小的数组。访问其边界外的元素不会使其变大。