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];
};

此外,变量valuename没有段错误(但如果你认为它们是,我可以发布设置这些值的代码。)但是现在,如果我能理解这个 gdb 输出,我会很高兴作为一个蛤!谢谢!

4

3 回答 3

14

您有所有经典缓冲区溢出的迹象。所有堆栈参数的值都已被 ASCII 文本覆盖 - 这是这些值的翻译(假设您有一个 little-endian 架构,看起来是正确的):

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 回答