Bypass Exec-shield Under Redhat里说到:
0x120 - 在execshield环境下的分析 ]
首先我们看看execshield的开关
[axis@axis explab]$ cat /proc/sys/kernel/exec-shield
1
[axis@axis explab]$ cat /proc/sys/kernel/randomize_va_space
1
[axis@axis explab]$
VA space randomize是2.6.x内核的一项特性,它会让虚拟地址随机变化,从而大大增加溢出的难度。但该项特性不在本文的讨论范围。但由于在高版本内核上它默认是开启的,所以我们不关闭他,以增加我们挑战的难度。
看来exec-shield和vs space random不是一回事。
这个东西我还没搞清楚。我们看看debian的,as4和as5的
root@debian~# uname -a
Linux debian 2.6.8-3-686-smp #1 SMP Tue Dec 5 23:17:50 UTC 2006 i686 GNU/Linux
root@debian~# ldd /bin/ls
librt.so.1 => /lib/tls/librt.so.1 (0x4001e000)
libacl.so.1 => /lib/libacl.so.1 (0x40024000)
libc.so.6 => /lib/tls/libc.so.6 (0x4002c000)
libpthread.so.0 => /lib/tls/libpthread.so.0 (0x40161000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
libattr.so.1 => /lib/libattr.so.1 (0x40170000)
root@debian~# ldd /bin/ls
librt.so.1 => /lib/tls/librt.so.1 (0x4001e000)
libacl.so.1 => /lib/libacl.so.1 (0x40024000)
libc.so.6 => /lib/tls/libc.so.6 (0x4002c000)
libpthread.so.0 => /lib/tls/libpthread.so.0 (0x40161000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
libattr.so.1 => /lib/libattr.so.1 (0x40170000)
root@debian~# !sys
sysctl -a | grep rand
kernel.random.uuid = 6f304dac-e088-4901-8089-ced6629c0a44
kernel.random.boot_id = 6a54ae47-ff17-4169-9ce8-6cdd3c400773
kernel.random.write_wakeup_threshold = 128
kernel.random.read_wakeup_threshold = 64
kernel.random.entropy_avail = 3584
kernel.random.poolsize = 512
debian的没有这些random的东西。
再看看as4
[root@sky2317 ~]# uname -a
Linux sky2317 2.6.9-55.ELsmp #1 SMP Fri Apr 20 17:03:35 EDT 2007 i686 i686 i386 GNU/Linux
[root@sky2317 ~]# sysctl -a | grep -e space -e exec
kernel.exec-shield-randomize = 1
kernel.exec-shield = 1
[root@sky2317 ~]# ldd /bin/ls
librt.so.1 => /lib/tls/librt.so.1 (0x00aeb000)
libacl.so.1 => /lib/libacl.so.1 (0x00ce8000)
libselinux.so.1 => /lib/libselinux.so.1 (0x00a9d000)
libc.so.6 => /lib/tls/libc.so.6 (0x00828000)
libpthread.so.0 => /lib/tls/libpthread.so.0 (0x00993000)
/lib/ld-linux.so.2 (0x0080e000)
libattr.so.1 => /lib/libattr.so.1 (0x00c12000)
[root@sky2317 ~]# ldd /bin/ls
librt.so.1 => /lib/tls/librt.so.1 (0x00aeb000)
libacl.so.1 => /lib/libacl.so.1 (0x008cf000)
libselinux.so.1 => /lib/libselinux.so.1 (0x00a9d000)
libc.so.6 => /lib/tls/libc.so.6 (0x00111000)
libpthread.so.0 => /lib/tls/libpthread.so.0 (0x00993000)
/lib/ld-linux.so.2 (0x0080e000)
libattr.so.1 => /lib/libattr.so.1 (0x00843000)
我们可以看到,as4下,2.6.9的内核里,有一些地址是变动的,有一些不是,但都没有linux-gate这个so
我们再看as5的
[root@sky2325 ~]# uname -a
Linux sky2325 2.6.18-53.el5PAE #1 SMP Wed Oct 10 16:48:18 EDT 2007 i686 i686 i386 GNU/Linux
[root@sky2325 ~]# sysctl -a | grep -e space -e exec
kernel.randomize_va_space = 1
kernel.exec-shield = 1
注意了,我们看看这里。
[root@sky2325 ~]# ldd /bin/ls
linux-gate.so.1 => (0x00208000)
librt.so.1 => /lib/librt.so.1 (0x00331000)
libacl.so.1 => /lib/libacl.so.1 (0x00285000)
libselinux.so.1 => /lib/libselinux.so.1 (0x002bb000)
libc.so.6 => /lib/libc.so.6 (0x0033a000)
libpthread.so.0 => /lib/libpthread.so.0 (0x002a2000)
/lib/ld-linux.so.2 (0x00114000)
libattr.so.1 => /lib/libattr.so.1 (0x0027e000)
libdl.so.2 => /lib/libdl.so.2 (0x00273000)
libsepol.so.1 => /lib/libsepol.so.1 (0x002d4000)
[root@sky2325 ~]# ldd /bin/ls
linux-gate.so.1 => (0x008df000)
librt.so.1 => /lib/librt.so.1 (0x00331000)
libacl.so.1 => /lib/libacl.so.1 (0x00285000)
libselinux.so.1 => /lib/libselinux.so.1 (0x002bb000)
libc.so.6 => /lib/libc.so.6 (0x00131000)
libpthread.so.0 => /lib/libpthread.so.0 (0x002a2000)
/lib/ld-linux.so.2 (0x00114000)
libattr.so.1 => /lib/libattr.so.1 (0x0027e000)
libdl.so.2 => /lib/libdl.so.2 (0x00273000)
linux gate和其他的都是变动的。
在san和iris的系统里,都有些不一致
san说linux-gate是一个入口,不会变的。iris用的是suse。
exec-sheild在rh的内核里才打开的,默认打开的。
在自己的内核里,exec-sheild是没有的,但 vs space是默认打开的。这个我在CBD机器验证了。
exec-sheild应该是不可执行,然后加上linux内核自己的基址随机,red hat其实挺安全了,exp比较难通用。
但一个韩国人写了个绕过exec sheild的,具体的要找牛人研究了。