3

セグメンテーション違反をデバッグしようとしていますが、gdb から次の出力が得られます。

(gdb) n

Program received signal SIGSEGV, Segmentation fault.
0x08048af9 in parse_option_list (ptr=0x6f72505f <Address 0x6f72505f out of bounds>, box_name=0x696d6978 <Address 0x696d6978 out of bounds>, option_list=0x313a7974, 
    num_elements=0x33313532) at submit.c:125
125                         memcpy(&(option_list[(*num_elements)].value), value, 24);
(gdb) p num_elements
$15 = (int *) 0x33313532
(gdb) p *num_elements
Cannot access memory at address 0x33313532
(gdb) 

memcpy() の何かがおかしくなっているように見えます。しかし、その行は非常に多くの変数を参照しているため、正確に何が問題なのかわかりません。

誰かが0x8048af9 in parse_option_list...行が私に言っていることを理解するのを助けることができますか?

私の関数の署名は次のとおりです。

int parse_option_list(char *ptr, char *box_name,
   struct option_list_values *option_list, int *num_elements)

そして、これは役に立つかもしれません:

struct option_list_values {
    char value[24];
    char name[24];
};

また、変数valueおよびnameは segfaulting ではありません (ただし、そう思われる場合は、それらの値を設定するコードを投稿できます)。ありがとうございました!

4

3 に答える 3

14

古典的なバッファ オーバーフローのすべての兆候があります。すべてのスタック パラメータの値は ASCII テキストで上書きされています。これらの値の変換は次のとおりです (リトルエンディアン アーキテクチャを使用していると仮定すると、これは正しいように見えます)。

ptr = 0x6f72505f = "_Pro"
box_name = 0x696d6978 = "ximi"
option_list = 0x313a7974 = "ty:1"
num_elements = 0x33313532 = "2513"

それらを連結すると"_Proximity:12513"、適切な境界チェックなしで、スタックに格納された配列にデータをコピーしている場所を特定できます。

于 2009-09-07T04:15:43.383 に答える
1

0x8048af9 は命令ポインタです。これは、SEGFAULT が発生したときにコードがあったメモリ内の実行可能コードのアドレスです。

option_list[(*num_elements)].value は有効なアドレスですか? バッファ オーバーフローが発生し、上書きしてはいけないものを上書きしている可能性があります。

num_elements が option_list の長さである場合、option_list[(*num_elements)] はリストの末尾の直後を参照します。

于 2009-09-07T03:47:06.577 に答える
0

ptr=0x6f72505f - 範囲外のアドレス 0x6f72505f これは、この場合に役立つ部分です。 parse_option_list への最初の入力が無効です。初期化されていないポインタの可能性があります。

于 2009-09-07T04:09:25.557 に答える