格式化输出引起的程序崩溃

服务器上的程序跑一段时间以后,进程就不存在了。
放开core文件限制:ulimit -c unlimited
等待产生core文件
分析core文件
(gdb) bt
#0  0x008711d3 in strlen () from /lib/libc.so.6
#1  0x00840c0e in vfprintf () from /lib/libc.so.6
#2  0x008613f4 in vsnprintf () from /lib/libc.so.6
#3  0x00846ec5 in snprintf () from /lib/libc.so.6
#4  0x08050598 in CHashMDM::Add (this=0x8073000, domain=0x2f36925c "xn--chinaka%64s-.com", tFrstVst=1372868283,
    nHourAvgFrqncy=30) at ./src/CHashMDM.cpp:36
#5  0x0805244d in CTaskTime::Run (this=0x9d712d0) at ./src/CTaskTime.cpp:117
#6  0x080589f6 in ThreadRun (pThread=0x9d712d0) at src/common/thread.cpp:24
#7  0x0097d832 in start_thread () from /lib/libpthread.so.0
#8  0x008d2e0e in clone () from /lib/libc.so.6
(gdb) l CHashMDM.cpp:36
36              snprintf(Data.dm, sizeof(Data.dm), dm);

漏了格式化输出:, "%s",导致snprintf把紧接着的参数domain当作格式化字符串,遇到网址xn--chinaka%64s-.com时,把%64s当作格式化字符来解释,
但又缺少了%64s的传入参数,程序就崩溃了。

参考:

格式化字符串攻击


其实这是函数调用时少参数的低级错误,但是编译器有合理的解释而并未报错。

不要依赖编辑器、编译器。基本功要扎实。写程序要专心。

展开阅读全文

没有更多推荐了,返回首页