关于StackSmashingDetected问题调查
■现象
密钥交换时报错: stack smashing detected ,产生CoreDump。
■再现步骤
1.密钥交换
■根本原因
使用解密函数写穿了局部变量的buffer,导致触发了stack protector机制。
代码分析:1
2
3
4
5
6
7
8
9
10int RootKeyCmdDown::procMsg(std::shared_ptr<ConnectionContext> conn)
{
logInfo("%s procMsg.", TAG.data());
vector<BYTE> dataVec;
dataVec.resize(32);
memset(&dataVec[0], 0, 32);
BYTE new_root_key[16] = {0};
get_new_rootkey(new_root_key);
.......
}
1 | aes_decrypt((unsigned char*)new_root_key_aes,32,pMsgContainer->GetRootKeyVector(),aes_decrypt_buf); |
1 | int aes_decrypt(unsigned char* in, int len , unsigned char* key, unsigned char* out) |
■调查详细
由于密钥交换触发条件比较麻烦,本示例使用的是测试程序,并非项目代码
1.打开产生Core文件选项
1 | root@mdm9607-perf:~/work/stack-protector# ulimit -c unlimited |
2.查看Core产生路径
1 | root@mdm9607-perf:~/work/stack-protector# cat /proc/sys/kernel/core_pattern |
相对路径core,代表Core文件生成在执行命令的当前目录下。
3.gdb调试
3.1 打印堆栈回溯
1 | root@mdm9607-perf:~/work/stack-protector# ./test_overflow_smash xxxxxxxxxxxxxxxx |
libc.so以后的堆栈回溯只能看到?号。百度一下,可能是libc.so的版本不对。也就是说集成环境的libc.so与我们编译的SDK中libc.so版本不一致。
3.2 拷贝SDK中的libc.so到环境中,编译时指定该目录
1 | root@mdm9607-perf:~/work/stack-protector# ls |
3.3 gdb中设置lib库的加载路径
1 | (gdb) set solib-absolute-prefix "./" |