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

服务器上的程序跑一段时间以后,进程就不存在了。
放开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的传入参数,程序就崩溃了。

参考:

格式化字符串攻击


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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值