【Linux】コアダンプ無しで、クラッシュを特定する
コアダンプがない状態で、クラッシュの原因を特定しろという無理難題きました
Jan 4 11:27:55 testsvr kernel: program[1234]: segfault at b31ff000 ip 008ce4d8 sp b31fcd04 error 6 in libc-2.12.so[855000+190000] |
エラー内容はこんな感じ
まず、error 6 なので、ユーザーメモリ内への書き込み保護例外が発生したことは分かります。
次にsegfault at xxxxx000 なので バッファーオーバーフローが発生してることが分かります
バッファーアンダーランの場合は xxxxxfffになる
次に、 objdump -d /lib/libc-2.12.so -F でベースアドレスを計算します
/lib/libc-2.12.so: file format elf32-i386 Disassembly of section .plt: 004f1a7c <calloc@plt-0x10> (File Offset: 0x16a7c): 4f1a7c: ff b3 04 00 00 00 pushl 0x4(%ebx) 4f1a82: ff a3 08 00 00 00 jmp *0x8(%ebx) 4f1a88: 00 00 add %al,(%eax) |
004f1a7c のオフセットアドレスが 16a7c であることからベースアドレスが 4db000 というのが計算できます
008ce4d8 から855000(再配置ベースアドレス)を差し引いて 4db000を加えたのが目的のアドレスになるので 5544d8 が目的の関数になります
objdump で /lib/libc-2.12.so を grep \>: で抽出してみます
00554050 <_obstack_free>:
005540e0 <strcat>:
00554290 <strchr>:
00554400 <strcmp>:
00554450 <__GI_strcmp>:
00554480 <strcoll>:
005544c0 <strcpy>:
005544e0 <strcspn>:
00554520 <__GI_strcspn>:
005545d0 <__strverscmp>:
00554730 <__strdup>:
00554790 <__strndup>:
00554800 <strerror>:
005548c0 <__strerror_r>:
005549f0 <strlen>:
00554a40 <__GI_strlen>:
00554b00 <strnlen>:
00554b90 <strncat>:
00554c30 <strncmp>:
00554c80 <strncpy>:
00554df0 <strrchr>:
00554fb0 <strpbrk>:
00554ff0 <__GI_strpbrk>:
00555490 <strtok>:
|
strcpyが目的関数です
5544c0: 55 push %ebp
5544c1: 89 e5 mov %esp,%ebp
5544c3: 8b 45 08 mov 0x8(%ebp),%eax
5544c6: 8b 55 0c mov 0xc(%ebp),%edx
5544c9: 56 push %esi
5544ca: 8d 70 ff lea -0x1(%eax),%esi
5544cd: 29 d6 sub %edx,%esi
5544cf: 90 nop
5544d0: 0f b6 0a movzbl (%edx),%ecx
5544d3: 83 c2 01 add $0x1,%edx
5544d6: 84 c9 test %cl,%cl
5544d8: 88 0c 32 mov %cl,(%edx,%esi,1)
5544db: 75 f3 jne 5544d0 <strcpy+0x10>
5544dd: 5e pop %esi
5544de: 5d pop %ebp
5544df: c3 ret
|
転送元文字列を1文字読み出した後、書き込むときにクラッシュなので合ってますね・ω・
ただし、書き込み先がスタックフレームになっているので、グローバル変数ではなく、ローカル変数に書き込みを行ったのではないかと推測できます。
と、これ以上は追跡はできません(((・ω・)))
Comments