セキュリティメモ (バイナリ) Last Update: 2015 05/07 Contact: [email protected] Author: Ryoma Kawaguchi (B2, Keio University) Jun Murai Lab., ARCH(Internet Architecture Research Team) @ Delta North. バッファオーバーフローとカーネルでの対策 バッファオーバーフロー(Buffer Oveflow)攻撃とは、 strcpy や gets などの脆弱性を持つ関数が呼び出されているプログラムによって発生する 脆弱性であり、確保されたバッファのサイズを上回って書き込む事によってCPUスタック上に確保されていた戻りアドレスを書き換え、シェル コードなどの任意のコードを実行させるための古典的な攻撃手法だ。 このバッファオーバーフロー攻撃に対抗する措置としてDEP(Exec-Shield)が挙げられる。これはNX-bitをx86系アーキテクチャでエミュレート するためのもので、スタックのデータ領域に置かれた不正コードが実行されているかどうかをカーネルが監視して実行をストップさせるセキュ リティ機構だ。これは以下のようなコマンドによって参照でき、0が無効、1が有効になっている。 ryoma@ryoma-ThinkPad-Edge-E130:~$ cat /proc/sys/kernel/exec-shield 1 (Enabled) これによってシェルコードの実行を困難にさせ、セキュリティを向上させる狙いがある。もう一つはASLR(Address Space Layout Randomization)だ。 ryoma@ryoma-ThinkPad-Edge-E130:~$ cat 08048000-08053000 r-xp 00000000 fc:00 08053000-08054000 r--p 0000a000 fc:00 08054000-08055000 rw-p 0000b000 fc:00 09f00000-09f21000 rw-p 00000000 00:00 b722f000-b731e000 r--p 00858000 fc:00 b731e000-b751e000 r--p 00000000 fc:00 b751e000-b751f000 rw-p 00000000 00:00 b751f000-b76c8000 r-xp 00000000 fc:00 b76c8000-b76c9000 ---p 001a9000 fc:00 b76c9000-b76cb000 r--p 001a9000 fc:00 b76cb000-b76cc000 rw-p 001ab000 fc:00 b76cc000-b76cf000 rw-p 00000000 00:00 b76e9000-b76eb000 rw-p 00000000 00:00 b76eb000-b76ec000 r-xp 00000000 00:00 b76ec000-b770c000 r-xp 00000000 fc:00 b770c000-b770d000 r--p 0001f000 fc:00 b770d000-b770e000 rw-p 00020000 fc:00 bf975000-bf996000 rw-p 00000000 00:00 /proc/self/maps 1835031 /bin/cat 1835031 /bin/cat 1835031 /bin/cat 0 [heap] 14950561 /usr/lib/locale/locale-archive 14950561 /usr/lib/locale/locale-archive 0 7864416 /lib/i386-linux-gnu/libc-2.19.so 7864416 /lib/i386-linux-gnu/libc-2.19.so 7864416 /lib/i386-linux-gnu/libc-2.19.so 7864416 /lib/i386-linux-gnu/libc-2.19.so 0 0 0 [vdso] 7864425 /lib/i386-linux-gnu/ld-2.19.so 7864425 /lib/i386-linux-gnu/ld-2.19.so 7864425 /lib/i386-linux-gnu/ld-2.19.so 0 [stack] ryoma@ryoma-ThinkPad-Edge-E130:~$ cat 08048000-08053000 r-xp 00000000 fc:00 08053000-08054000 r--p 0000a000 fc:00 08054000-08055000 rw-p 0000b000 fc:00 08f99000-08fba000 rw-p 00000000 00:00 b72f6000-b73e5000 r--p 00858000 fc:00 b73e5000-b75e5000 r--p 00000000 fc:00 b75e5000-b75e6000 rw-p 00000000 00:00 b75e6000-b778f000 r-xp 00000000 fc:00 b778f000-b7790000 ---p 001a9000 fc:00 b7790000-b7792000 r--p 001a9000 fc:00 b7792000-b7793000 rw-p 001ab000 fc:00 b7793000-b7796000 rw-p 00000000 00:00 b77b0000-b77b2000 rw-p 00000000 00:00 b77b2000-b77b3000 r-xp 00000000 00:00 b77b3000-b77d3000 r-xp 00000000 fc:00 b77d3000-b77d4000 r--p 0001f000 fc:00 b77d4000-b77d5000 rw-p 00020000 fc:00 bf9ba000-bf9db000 rw-p 00000000 00:00 ryoma@ryoma-ThinkPad-Edge-E130:~$ /proc/self/maps 1835031 /bin/cat 1835031 /bin/cat 1835031 /bin/cat 0 [heap] 14950561 /usr/lib/locale/locale-archive 14950561 /usr/lib/locale/locale-archive 0 7864416 /lib/i386-linux-gnu/libc-2.19.so 7864416 /lib/i386-linux-gnu/libc-2.19.so 7864416 /lib/i386-linux-gnu/libc-2.19.so 7864416 /lib/i386-linux-gnu/libc-2.19.so 0 0 0 [vdso] 7864425 /lib/i386-linux-gnu/ld-2.19.so 7864425 /lib/i386-linux-gnu/ld-2.19.so 7864425 /lib/i386-linux-gnu/ld-2.19.so 0 [stack] Return-to-libcによるDEP回避 ryoma@ryoma-ThinkPad-Edge-E130:~$ cat /proc/sys/kernel/randomize_va_space 2 ryoma@ryoma-ThinkPad-Edge-E130:~$ sudo sysctl -w kernel.randomize_va_space=0 [sudo] password for ryoma: kernel.randomize_va_space = 0 ryoma@ryoma-ThinkPad-Edge-E130:~$ cat /proc/sys/kernel/randomize_va_space 0 ryoma@ryoma-ThinkPad-Edge-E130:~$ ROP+Return-to-libcによるDEP+ASLR回避 書式文字列攻撃 GOT Overwrite attackと対策 80484ae: 80484b3: 80484b6: 80484b9: 80484bb: 80484bf: 80484c3: 80484c6: 80484cb: 80484cf: 80484d2: e8 8b 83 8b 89 8d 89 e8 8d 89 e8 7d 45 c0 00 44 44 04 75 44 04 79 fe ff ff 0c 04 24 24 24 fe 24 24 fe 04 14 ff ff 14 ff ff call mov add mov mov lea mov call lea mov call 8048330 <printf@plt> eax,DWORD PTR [ebp+0xc] eax,0x4 eax,DWORD PTR [eax] DWORD PTR [esp+0x4],eax eax,[esp+0x14] DWORD PTR [esp],eax 8048340 <strcpy@plt> eax,[esp+0x14] DWORD PTR [esp],eax 8048350 <puts@plt> Disassembly of section .plt: 08048320 <printf@plt-0x10>: 8048320: ff 35 04 a0 04 08 8048326: ff 25 08 a0 04 08 804832c: 00 00 ... push jmp add DWORD PTR ds:0x804a004 DWORD PTR ds:0x804a008 BYTE PTR [eax],al 08048330 <printf@plt>: 8048330: ff 25 0c a0 04 08 8048336: 68 00 00 00 00 804833b: e9 e0 ff ff ff jmp push jmp DWORD PTR ds:0x804a00c 0x0 8048320 <_init+0x2c> 08048340 <strcpy@plt>: 8048340: ff 25 10 a0 04 08 8048346: 68 08 00 00 00 804834b: e9 d0 ff ff ff jmp push jmp DWORD PTR ds:0x804a010 0x8 8048320 <_init+0x2c> 08048350 <puts@plt>: 8048350: ff 25 14 a0 04 08 8048356: 68 10 00 00 00 804835b: e9 c0 ff ff ff jmp push jmp DWORD PTR ds:0x804a014 0x10 8048320 <_init+0x2c> 08048360 <__gmon_start__@plt>: 8048360: ff 25 18 a0 04 08 8048366: 68 18 00 00 00 804836b: e9 b0 ff ff ff jmp push jmp DWORD PTR ds:0x804a018 0x18 8048320 <_init+0x2c> 08048370 <__libc_start_main@plt>: 8048370: ff 25 1c a0 04 08 8048376: 68 20 00 00 00 804837b: e9 a0 ff ff ff jmp push jmp DWORD PTR ds:0x804a01c 0x20 8048320 <_init+0x2c> Disassembly of section .got: 08049ffc <.got>: 8049ffc: 00 00 ... add BYTE PTR [eax],al adc add al,0x9f al,0x8 Disassembly of section .got.plt: 0804a000 <_GLOBAL_OFFSET_TABLE_>: 804a000: 14 9f 804a002: 04 08 ... 804a00c: 36 83 04 08 46 804a011: 83 04 08 56 804a015: 83 04 08 66 804a019: 83 04 08 76 804a01d: 83 804a01e: 04 08 add DWORD PTR add DWORD PTR add DWORD PTR add DWORD PTR .byte 0x83 add al,0x8 ss:[eax+ecx*1],0x46 [eax+ecx*1],0x56 [eax+ecx*1],0x66 [eax+ecx*1],0x76 ryoma@ryoma-ThinkPad-Edge-E130:~$ readelf -S ~/Desktop/a.out | grep [22] .got PROGBITS 08049ffc 000ffc 000004 04 [23] .got.plt PROGBITS 0804a000 001000 000020 04 ryoma@ryoma-ThinkPad-Edge-E130:~$ readelf -S ~/Desktop/a.out | grep [10] .rel.plt REL 080482cc 0002cc 000028 08 [12] .plt PROGBITS 08048320 000320 000060 04 [23] .got.plt PROGBITS 0804a000 001000 000020 04 ryoma@ryoma-ThinkPad-Edge-E130:~$ ".got" WA 0 0 4 WA 0 0 4 ".plt" A 5 12 4 AX 0 0 16 WA 0 0 4
© Copyright 2025 ExpyDoc