事情是这样的。
在做一个题的时候出了点问题,写了个程序测试一下。

讲道理在你输入11个字符之后就会报段错误,但是我测试发现,必须输入18个字符的时候才会报错,18个字符以前一切正常,然后开始溯源。
这是输入18个以内正常时候的样子。

这是输入18个的时候报错的样子。

不同的是main返回的地方,一个是__libc_start_main + 80,一个是__libc_start_main + 235,开始往上找这里是啥时候变得。
找到是gets里面一个地方搞的鬼,他对rdx指向的内容做了操作,而rdx正好指向我们的返回地址那里,但是会发现这个时候rdx的值是不一样的。
这个是正常的,他没有对返回地址产生影响就是rdx里面指向的是返回地址附近的一个地方,然后将一个字节变成0,就没啥事。


但是这个变了的,rdx指向的就是返回地址,最后一位9b变成了00,所以就从+235变成了+80
那么rdx是啥时候变的?

破案了
这句话,rdx不一样因为之前rbx与rax不一样?
这是正常的那个

这事报错那个。

发现rbx一样,但是rax确实不一样,rax是我输入的字符的数目。
跟踪程序,发现问题出现在这里。
跟进_IO_getline函数。
然后并没有发现什么好结果
又回来一想,gets函数后面自动会补一个‘\x00’,破案了。就是因为多了这个0把9b改成了0,然后就有了这么多事。
我直呼好家伙!
博主在编程实践中发现,使用gets函数处理输入时,输入18个字符而非预期的11个字符时引发段错误。通过调试发现,问题出在gets函数内部对rdx寄存器的操作,该寄存器在异常情况下直接指向返回地址并导致其改变。进一步分析发现,是因为gets函数自动添加的空字符'x00'覆盖了返回地址,从而改变了程序执行流程。博主通过跟踪代码和理解内存布局成功定位并解释了这个问题。
1931

被折叠的 条评论
为什么被折叠?



