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是我输入的字符的数目。

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

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

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

我直呼好家伙!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值