忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT HPC论坛 徽章 文库 沙龙 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 554 | 回复: 7

[技术动态] dlsym hook function crash [复制链接]

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:03
发表于 2017-07-11 21:19 |显示全部楼层
本帖最后由 shihyu 于 2017-07-12 00:29 编辑
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stddef.h>
  4. #include <unistd.h>
  5. #include <dlfcn.h>

  6. void* malloc(size_t size)
  7. {
  8.     char buf[32];
  9.     static void* (*real_malloc)(size_t) = NULL;
  10. printf("ggggggggggg");

  11.     if (real_malloc == NULL) {
  12.         *(void**)(&real_malloc) = dlsym(RTLD_NEXT, "malloc");
  13.     }

  14.     sprintf(buf, "malloc called, size = %zu\n", size);
  15.     write(2, buf, strlen(buf));
  16.     return real_malloc(size);
  17. }

  18. void free(void* ptr)
  19. {
  20.     char buf[32];
  21.     static void* (*real_free)(void* ptr) = NULL;

  22.     if (real_free == NULL) {
  23.         *(void**)(&real_free) = dlsym(RTLD_NEXT, "free");
  24.     }

  25.     sprintf(buf, "free called, ptr address = %p\n", ptr);
  26.     write(2, buf, strlen(buf));
  27.     real_free(ptr);
  28. }
复制代码
gcc -D_GNU_SOURCE -shared -fPIC -o libmcount.so malloc_count.c -ldl
LD_PRELOAD=./libmcount.so ls

不明白在malloc函数里面 printf 函数会造成 crash ? 看網上dlsym hook一些例子只用 write or fprintf 而不用 printf

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:03
发表于 2017-07-12 00:27 |显示全部楼层
  1. #define _GNU_SOURCE
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <dlfcn.h>

  5. typedef size_t (*strlen_t)(const char *str);
  6. size_t strlen(const char *str) {
  7.     strlen_t real_strlen = (strlen_t) dlsym(RTLD_NEXT, "strlen");
  8.     printf("calling strlen.\n");
  9.     return real_strlen(str);
  10. }
复制代码

  1. #include <stdio.h>
  2. #include <string.h>
  3. int main(int argc, char* argv[])
  4. {
  5.     char s[] = "hello, world!";
  6.     printf("length is %d\n", strlen(s));
  7.     return 0;
  8. }
复制代码


我又测试一版本是 hook strlen 在里面用 printf 没问题
编译指令:
gcc -shared -fPIC hook.c -o hook.so -ldl
LD_PRELOAD=$PWD/hook.so ./test

这样是 printf 跟 malloc 之间有什么关系嘛?
printf 底层是会call到 malloc 所以造成 crash?

论坛徽章:
12
水瓶座
日期:2014-06-10 09:51:0215-16赛季CBA联赛之吉林
日期:2016-08-20 10:43:1215-16赛季CBA联赛之广夏
日期:2016-06-23 09:53:58程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-09 06:20:0015-16赛季CBA联赛之上海
日期:2015-12-25 16:40:3515-16赛季CBA联赛之广夏
日期:2015-12-22 09:39:36程序设计版块每日发帖之星
日期:2015-08-24 06:20:002015亚冠之德黑兰石油
日期:2015-08-07 09:57:302015年辞旧岁徽章
日期:2015-03-03 16:54:15摩羯座
日期:2014-07-21 10:11:2815-16赛季CBA联赛之八一
日期:2017-04-12 14:26:28
发表于 2017-07-12 11:53 |显示全部楼层
本帖最后由 lxyscls 于 2017-07-12 12:21 编辑

贴栈信息看下

LD_PRELOAD=./libmcount.so ls
1.cap      build        hello world   malloc_count.c          node_modules  pmfm          swagger     t.c    v2
aaaa.pcap  code         l             n2n_v2_fork-master      pip-9.0.1     RESTServer    swagger.sh  t.cpp  whl
api        crossdomain  libmcount.so  n2n_v2_fork-master.zip  pktgen        RESTServerV2  t           t.o    xxxlll

cat /etc/centos-release
CentOS Linux release 7.0.1406 (Core)


论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:03
发表于 2017-07-12 14:10 |显示全部楼层
gdb ls core

  1. #28848 0x00007fd3c8b45899 in printf () from /lib/x86_64-linux-gnu/libc.so.6
  2. #28849 0x00007fd3c90dc89d in malloc () from ./libmcount.so
  3. #28850 0x00007fd3c8b5d1d5 in _IO_file_doallocate () from /lib/x86_64-linux-gnu/libc.so.6
  4. #28851 0x00007fd3c8b6b594 in _IO_doallocbuf () from /lib/x86_64-linux-gnu/libc.so.6
  5. #28852 0x00007fd3c8b6a8f8 in _IO_file_overflow () from /lib/x86_64-linux-gnu/libc.so.6
  6. #28853 0x00007fd3c8b6928d in _IO_file_xsputn () from /lib/x86_64-linux-gnu/libc.so.6
  7. #28854 0x00007fd3c8b3d241 in vfprintf () from /lib/x86_64-linux-gnu/libc.so.6
  8. #28855 0x00007fd3c8b45899 in printf () from /lib/x86_64-linux-gnu/libc.so.6
  9. #28856 0x00007fd3c90dc89d in malloc () from ./libmcount.so
  10. #28857 0x00007fd3c8b5d1d5 in _IO_file_doallocate () from /lib/x86_64-linux-gnu/libc.so.6
  11. #28858 0x00007fd3c8b6b594 in _IO_doallocbuf () from /lib/x86_64-linux-gnu/libc.so.6
  12. #28859 0x00007fd3c8b6a8f8 in _IO_file_overflow () from /lib/x86_64-linux-gnu/libc.so.6
  13. #28860 0x00007fd3c8b6928d in _IO_file_xsputn () from /lib/x86_64-linux-gnu/libc.so.6
  14. #28861 0x00007fd3c8b3d241 in vfprintf () from /lib/x86_64-linux-gnu/libc.so.6
  15. #28862 0x00007fd3c8b45899 in printf () from /lib/x86_64-linux-gnu/libc.so.6
  16. #28863 0x00007fd3c90dc89d in malloc () from ./libmcount.so
  17. #28864 0x00007fd3c8b5d1d5 in _IO_file_doallocate () from /lib/x86_64-linux-gnu/libc.so.6
  18. #28865 0x00007fd3c8b6b594 in _IO_doallocbuf () from /lib/x86_64-linux-gnu/libc.so.6
  19. #28866 0x00007fd3c8b6a8f8 in _IO_file_overflow () from /lib/x86_64-linux-gnu/libc.so.6
  20. #28867 0x00007fd3c8b6928d in _IO_file_xsputn () from /lib/x86_64-linux-gnu/libc.so.6
  21. #28868 0x00007fd3c8b3d241 in vfprintf () from /lib/x86_64-linux-gnu/libc.so.6
  22. #28869 0x00007fd3c8b45899 in printf () from /lib/x86_64-linux-gnu/libc.so.6
  23. #28870 0x00007fd3c90dc89d in malloc () from ./libmcount.so
  24. #28871 0x00007fd3c8b5d1d5 in _IO_file_doallocate () from /lib/x86_64-linux-gnu/libc.so.6
  25. #28872 0x00007fd3c8b6b594 in _IO_doallocbuf () from /lib/x86_64-linux-gnu/libc.so.6
  26. #28873 0x00007fd3c8b6a8f8 in _IO_file_overflow () from /lib/x86_64-linux-gnu/libc.so.6
  27. #28874 0x00007fd3c8b6928d in _IO_file_xsputn () from /lib/x86_64-linux-gnu/libc.so.6
  28. #28875 0x00007fd3c8b3d241 in vfprintf () from /lib/x86_64-linux-gnu/libc.so.6
  29. <font color="#ff0000">#28876 0x00007fd3c8b45899 in printf () from /lib/x86_64-linux-gnu/libc.so.6
  30. #28877 0x00007fd3c90dc89d in malloc () from ./libmcount.so</font>
  31. #28878 0x00007fd3c8b5dcdd in ?? () from /lib/x86_64-linux-gnu/libc.so.6
  32. #28879 0x00007fd3c8ec49b6 in selinuxfs_exists () from /lib/x86_64-linux-gnu/libselinux.so.1
  33. #28880 0x00007fd3c8ebfcdc in ?? () from /lib/x86_64-linux-gnu/libselinux.so.1
  34. #28881 0x00007fd3c92ee6ba in ?? () from /lib64/ld-linux-x86-64.so.2
  35. #28882 0x00007fd3c92ee7cb in ?? () from /lib64/ld-linux-x86-64.so.2
  36. #28883 0x00007fd3c92dec6a in ?? () from /lib64/ld-linux-x86-64.so.2
  37. #28884 0x0000000000000002 in ?? ()
  38. #28885 0x00007ffc1b6f537a in ?? ()
  39. #28886 0x00007ffc1b6f537d in ?? ()
  40. #28887 0x0000000000000000 in ?? ()
复制代码

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
发表于 2017-07-12 14:43 |显示全部楼层
死递归了吗?
malloc 调用 printf,printf内部又要调用malloc,……

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:03
发表于 2017-07-12 14:53 |显示全部楼层
core dump 看起来像是 printf 递归 call malloc ,
可是 printf 为什么需要递归 call malloc ? 
glibc printf 代码里面可以看出来有 递归 call malloc?

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
发表于 2017-07-12 14:58 |显示全部楼层
可是 printf 为什么需要递归 call malloc ? 
------ printf没有递归 call malloc,printf就是调用了malloc一下。谁知你的malloc又调用printf,这才导致死递归。

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-09-23 06:20:00
发表于 2017-08-10 22:02 |显示全部楼层
递归调用malloc,栈溢出了。printf 里面肯定直接或者间接call malloc的, 在你自己的malloc实现里面先调用 real_malloc()再调用其它函数.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

SACC2017购票8.8折优惠进行时

2017中国系统架构师大会(SACC2017)将于10月19-21日在北京新云南皇冠假日酒店震撼来袭。今年,大会以“云智未来”为主题,云集国内外顶级专家,围绕云计算、人工智能、大数据、移动互联网、产业应用等热点领域展开技术探讨与交流。本届大会共设置2大主会场,18个技术专场;邀请来自互联网、金融、制造业、电商等多个领域,100余位技术专家及行业领袖来分享他们的经验;并将吸引4000+人次的系统运维、架构师及IT决策人士参会,为他们提供最具价值的交流平台。
----------------------------------------
优惠时间:2017年8月2日前

活动链接>>
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP