pou*_*def 3 c gdb segmentation-fault
我正在尝试调试段错误,我从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)
Run Code Online (Sandbox Code Playgroud)
它看起来像memcpy()中的东西正在变得混乱.但我无法弄清楚究竟是什么问题,因为该行引用了这么多变量.
有人可以帮助弄清楚这0x8048af9 in parse_option_list...条线告诉我的是什么吗?
我的功能签名是:
int parse_option_list(char *ptr, char *box_name,
struct option_list_values *option_list, int *num_elements)
Run Code Online (Sandbox Code Playgroud)
这可能有用:
struct option_list_values {
char value[24];
char name[24];
};
Run Code Online (Sandbox Code Playgroud)
此外,变量value和name不段错误(但如果你认为他们是,我可以张贴这台这些值.代码)但现在,如果我能理解这个gdb的输出,我会很高兴,因为蛤!谢谢!
caf*_*caf 14
你有经典缓冲区溢出的所有迹象.所有堆栈参数的值都被ASCII文本覆盖 - 这是这些值的转换(假设您有一个小端架构,看起来正确):
ptr = 0x6f72505f = "_Pro"
box_name = 0x696d6978 = "ximi"
option_list = 0x313a7974 = "ty:1"
num_elements = 0x33313532 = "2513"
Run Code Online (Sandbox Code Playgroud)
将它们连接在一起会产生"_Proximity:12513"- 如果这个子字符串看起来很熟悉,那么你应该能够找到数据被复制的位置 - 某处你将它复制到存储在堆栈中的数组中,而没有进行适当的边界检查.