Changes between Version 17 and Version 18 of Dev/KernelHack/COINS/worklog/201111


Ignore:
Timestamp:
Nov 25, 2011 2:51:04 AM (12 years ago)
Author:
mitty
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Dev/KernelHack/COINS/worklog/201111

    v17 v18  
    39043904Nov 24 01:48:53 ubuntu-lucid64 kernel: [ 1509.353971] proc_file_read: Apparent buffer overflow! 
    39053905}}} 
     3906 
     3907 == /proc fs with seq_file == 
     3908 * [http://wiki.bit-hive.com/tomizoo/pg/proc%20fs%20%A4%F2%BB%C8%A4%C3%A4%BF%A5%AB%A1%BC%A5%CD%A5%EB%BE%F0%CA%F3%A4%CE%C9%BD%BC%A8%20%A4%BD%A4%CE2 proc fs を使ったカーネル情報の表示 その2 - とみぞーノート] 
     3909 * [http://pylone.jp/blog/tips_seq_file seq_fileの使い方 - Pylone Blog] 
     3910 
     3911 * 参考 
     3912  * fs/proc/loadavg.c 
     3913   * single_open 
     3914  * fs/proc/devices.c 
     3915   * seq_open 
     3916 
     3917 * s0711489@ubuntu-lucid64:~$ sudo insmod stackmod.ko entry=1000 
     3918 * s0711489@ubuntu-lucid64:~$ sudo mknod /dev/stack c 251 0 
     3919 * s0711489@ubuntu-lucid64:~$ sudo chmod 666 /dev/stack 
     3920 * s0711489@ubuntu-lucid64:~$ dd if=/dev/zero of=/dev/stack 
     3921{{{ 
     3922dd: writing to `/dev/stack': No space left on device 
     39231001+0 records in 
     39241000+0 records out 
     3925512000 bytes (512 kB) copied, 0.0338233 s, 15.1 MB/s 
     3926}}} 
     3927 
     3928 * s0711489@ubuntu-lucid64:~$ cat /proc/stackmod 
     3929{{{ 
     3930stack: 1000 
     3931stack.data[0].length:    512 
     3932stack.data[1].length:    512 
     3933 
     3934(snip) 
     3935 
     3936stack.data[997].length:    512 
     3937stack.data[998].length:    512 
     3938stack.data[999].length:    512 
     3939}}} 
     3940 
     3941 * s0711489@ubuntu-lucid64:~$ tailf /var/log/kern.log 
     3942{{{ 
     3943Nov 24 03:26:17 ubuntu-lucid64 kernel: [ 4468.813821] /proc/stackmod is opened 
     3944}}} 
     3945 
     3946 === no stack, no /proc output === 
     3947 * s0711489@ubuntu-lucid64:~$ echo hoge > /dev/stack 
     3948 * s0711489@ubuntu-lucid64:~$ cat /proc/stackmod 
     3949{{{ 
     3950stack: 1 
     3951stack.data[0].length:      5 
     3952}}} 
     3953 * s0711489@ubuntu-lucid64:~$ cat /dev/stack 
     3954{{{ 
     3955hoge 
     3956}}} 
     3957 * s0711489@ubuntu-lucid64:~$ cat /proc/stackmod 
     3958{{{ 
     3959}}} 
     3960 
     3961 === debug with gdb === 
     3962 * s0711489@ubuntu-lucid64:~$ cat /sys/module/stackmod/sections/.text 
     3963{{{ 
     39640xffffffffa0056000 
     3965}}} 
     3966 * s0711489@ubuntu-lucid64:~$ cat /sys/module/stackmod/sections/.data 
     3967{{{ 
     39680xffffffffa00568e8 
     3969}}} 
     3970 * s0711489@ubuntu-lucid64:~$ cat /sys/module/stackmod/sections/.bss 
     3971{{{ 
     39720xffffffffa0056b30 
     3973}}} 
     3974 
     3975 * s0711489@ubuntu-lucid64:~$ cat /proc/stackmod 
     3976{{{ 
     3977}}} 
     3978{{{ 
     3979(gdb) file vmlinux 
     3980Reading symbols from /home/ugrad/07/s0711489/coursework/KernelHack/linux-2.6.35.14/x86_64/vmlinux...(no debugging symbols found)...done. 
     3981(gdb) add-symbol-file ../../04/stackmod/stackmod.o 0xffffffffa0056000 -s .data 0xffffffffa00568e8 -s .bss 0xffffffffa0056b30 
     3982add symbol table from file "../../04/stackmod/stackmod.o" at 
     3983        .text_addr = 0xffffffffa0056000 
     3984        .data_addr = 0xffffffffa00568e8 
     3985        .bss_addr = 0xffffffffa0056b30 
     3986(y or n) y 
     3987Reading symbols from /home/ugrad/07/s0711489/coursework/KernelHack/04/stackmod/stackmod.o...done. 
     3988(gdb) target remote localhost:8864 
     3989Remote debugging using localhost:8864 
     39900xffffffff810097a9 in native_safe_halt () 
     3991    at /home/ugrad/07/s0711489/coursework/KernelHack/linux-2.6.35.14/x86_64/arch/x86/include/asm/irqflags.h:49 
     399249              asm volatile("sti; hlt": : :"memory"); 
     3993(gdb) b proc_seq_start 
     3994Breakpoint 1 at 0xffffffffa00560cb: file /home/ugrad/07/s0711489/coursework/KernelHack/04/stackmod/stackmod.c, line 153. 
     3995(gdb) c 
     3996Continuing. 
     3997 
     3998Breakpoint 1, proc_seq_start (m=0xffff880017e3a180, pos=0xffff88001b737e98) 
     3999    at /home/ugrad/07/s0711489/coursework/KernelHack/04/stackmod/stackmod.c:153 
     4000153             if (*pos == 0) { 
     4001(gdb) p *pos 
     4002$1 = 0 
     4003(gdb) n 
     4004154                     seq_printf(m, "stack: %d\n", stack.depth); 
     4005(gdb) 
     4006157             if (*pos < stack.depth) { 
     4007(gdb) 
     4008162     } 
     4009(gdb) 
     4010157             if (*pos < stack.depth) { 
     4011(gdb) 
     4012162     } 
     4013(gdb) 
     4014seq_read (file=0xffff88001b66c240, 
     4015    buf=0xc8a000 <Address 0xc8a000 out of bounds>, size=32768, 
     4016    ppos=0xffff88001b737f48) at fs/seq_file.c:197 
     4017197                     if (!p || IS_ERR(p)) 
     4018(gdb) bt 
     4019#0  seq_read (file=0xffff88001b66c240, 
     4020    buf=0xc8a000 <Address 0xc8a000 out of bounds>, size=32768, 
     4021    ppos=0xffff88001b737f48) at fs/seq_file.c:197 
     4022#1  0xffffffff81124b07 in proc_reg_read (file=0xffff88001b66c240, 
     4023    buf=0xc8a000 <Address 0xc8a000 out of bounds>, count=32768, 
     4024    ppos=0xffff88001b737f48) at fs/proc/inode.c:163 
     4025#2  0xffffffff810df784 in vfs_read (file=0xffff88001b66c240, 
     4026    buf=0xc8a000 <Address 0xc8a000 out of bounds>, count=0, 
     4027    pos=0xffff88001b737f48) at fs/read_write.c:310 
     4028#3  0xffffffff810dfa2b in sys_read (fd=<value optimized out>, 
     4029    buf=0xc8a000 <Address 0xc8a000 out of bounds>, count=32768) 
     4030    at fs/read_write.c:400 
     4031#4  0xffffffff810029eb in ?? () 
     4032#5  0x0000000000000246 in ?? () 
     4033#6  0x00007fffced80000 in ?? () 
     4034#7  0x0000000000000000 in ?? () 
     4035(gdb) c 
     4036Continuing. 
     4037}}} 
     4038 
     4039 === fix it to read /proc correctly === 
     4040 * s0711489@ubuntu-lucid64:~$ sudo insmod stackmod.ko 
     4041 * s0711489@ubuntu-lucid64:~$ cat /proc/stackmod 
     4042{{{ 
     4043stack: 0 
     4044}}} 
     4045 * s0711489@ubuntu-lucid64:~$ sudo mknod /dev/stack c 251 0 
     4046 * s0711489@ubuntu-lucid64:~$ sudo chmod 666 /dev/stack 
     4047 * s0711489@ubuntu-lucid64:~$ echo hoge > /dev/stack 
     4048 * s0711489@ubuntu-lucid64:~$ cat /proc/stackmod 
     4049{{{ 
     4050stack: 1 
     4051stack.data[0].length:      5 
     4052}}} 
     4053 * s0711489@ubuntu-lucid64:~$ cat /dev/stack 
     4054{{{ 
     4055hoge 
     4056}}} 
     4057 * s0711489@ubuntu-lucid64:~$ cat /proc/stackmod 
     4058{{{ 
     4059stack: 0 
     4060}}} 
     4061 
     4062 * s0711489@ubuntu-lucid64:~$ dd if=/dev/zero of=/dev/stack bs=10 
     4063{{{ 
     4064dd: writing `/dev/stack': No space left on device 
     4065129+0 records in 
     4066128+0 records out 
     40671280 bytes (1.3 kB) copied, 0.00669531 s, 191 kB/s 
     4068}}} 
     4069 * s0711489@ubuntu-lucid64:~$ cat /proc/stackmod 
     4070{{{ 
     4071stack: 128 
     4072stack.data[0].length:     10 
     4073stack.data[1].length:     10 
     4074 
     4075(snip) 
     4076 
     4077stack.data[125].length:     10 
     4078stack.data[126].length:     10 
     4079stack.data[127].length:     10 
     4080}}} 
     4081 * s0711489@ubuntu-lucid64:~$ cat /dev/stack 
     4082 * s0711489@ubuntu-lucid64:~$ cat /proc/stackmod 
     4083{{{ 
     4084stack: 0 
     4085}}}