【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文字読み出した後、書き込むときにクラッシュなので合ってますね・ω・
ただし、書き込み先がスタックフレームになっているので、グローバル変数ではなく、ローカル変数に書き込みを行ったのではないかと推測できます。

と、これ以上は追跡はできません(((・ω・)))

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です