C:检测到堆栈粉碎但在 return 语句之前一切正常
C : stack smashing detected but everything is working before return statement
好的,所以在 Whosebug 上检测到很多 stack smashing 问题,我查看了其中的 6-7 个,但无法解决我的问题。
我在 C 中有一个名为 encryptor 的 void 函数,它接受一个 char 数组,并更新该数组。
void encryptor(char* m,char* K){
char T[5] = "1011[=11=]"; // added the last '[=11=]'
int l = countOnes(K);
for (int i=0; i<l; i=i+1){
char TT[33];
TT[32] = '[=11=]'; // Last character is '[=11=]'
strcat(TT,T); strcat(TT,T); strcat(TT,T); strcat(TT,T); strcat(TT,T); strcat(TT,T); strcat(TT,T); strcat(TT,T); // 8 times
string_xor(m,TT,m);
addOne(T);
}
printf("%s\n", m); // <======*** This print is working
// The output of print is correct encrypted bitstring
// of length 32 : 11011101110111011101110111011101
return;
}
这里是对应的int主代码:
int main(){
char message[33] = "11001100110011001100110011001100";
message[32]='[=12=]';
char key[33] = "00100010001000100010001000100011";
key[32]='[=12=]';
// encryptor takes a 32 bitstring and uses key to encrypt it
// All other functions in encryptor are working and even m is being updated
encryptor(message,key);
}
由于程序流在 return 语句之前到达打印函数,并且在检测到堆栈粉碎之后,这可能是什么原因
我尝试使用 gdb 调试器,但它显示
Program received signal SIGABRT, Aborted.
0x00007ffff7a55860 in raise () from /usr/lib/libc.so.6
任何人都可以帮我找出(或找出任何方法)这个错误的原因(我不认为它是因为缓冲区溢出或到达打印功能时的其他原因)
谢谢
发现大错,strcat没有将T字符串复制到TT,而是通过引用做了一些事情。
并且由于此指针引用了在函数的框架中创建的某个东西,它在函数结束后销毁,因此会引发错误。
由于字符数组基本上是一个指针,所以一旦函数returns将指针变成垃圾值就会出错
好的,所以在 Whosebug 上检测到很多 stack smashing 问题,我查看了其中的 6-7 个,但无法解决我的问题。
我在 C 中有一个名为 encryptor 的 void 函数,它接受一个 char 数组,并更新该数组。
void encryptor(char* m,char* K){
char T[5] = "1011[=11=]"; // added the last '[=11=]'
int l = countOnes(K);
for (int i=0; i<l; i=i+1){
char TT[33];
TT[32] = '[=11=]'; // Last character is '[=11=]'
strcat(TT,T); strcat(TT,T); strcat(TT,T); strcat(TT,T); strcat(TT,T); strcat(TT,T); strcat(TT,T); strcat(TT,T); // 8 times
string_xor(m,TT,m);
addOne(T);
}
printf("%s\n", m); // <======*** This print is working
// The output of print is correct encrypted bitstring
// of length 32 : 11011101110111011101110111011101
return;
}
这里是对应的int主代码:
int main(){
char message[33] = "11001100110011001100110011001100";
message[32]='[=12=]';
char key[33] = "00100010001000100010001000100011";
key[32]='[=12=]';
// encryptor takes a 32 bitstring and uses key to encrypt it
// All other functions in encryptor are working and even m is being updated
encryptor(message,key);
}
由于程序流在 return 语句之前到达打印函数,并且在检测到堆栈粉碎之后,这可能是什么原因
我尝试使用 gdb 调试器,但它显示
Program received signal SIGABRT, Aborted. 0x00007ffff7a55860 in raise () from /usr/lib/libc.so.6
任何人都可以帮我找出(或找出任何方法)这个错误的原因(我不认为它是因为缓冲区溢出或到达打印功能时的其他原因)
谢谢
发现大错,strcat没有将T字符串复制到TT,而是通过引用做了一些事情。
并且由于此指针引用了在函数的框架中创建的某个东西,它在函数结束后销毁,因此会引发错误。
由于字符数组基本上是一个指针,所以一旦函数returns将指针变成垃圾值就会出错