gets函数导致的__libc_start_main+235变为__libc_start_main+80原因以及调试

事情是这样的。

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

在这里插入图片描述
讲道理在你输入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是我输入的字符的数目。

扫描二维码关注公众号,回复: 12472244 查看本文章

跟踪程序,发现问题出现在这里。
在这里插入图片描述跟进_IO_getline函数。

然后并没有发现什么好结果

又回来一想,gets函数后面自动会补一个‘\x00’,破案了。就是因为多了这个0把9b改成了0,然后就有了这么多事。

我直呼好家伙!

猜你喜欢

转载自blog.csdn.net/yongbaoii/article/details/113356888