微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当我使用0作为FILE *从rop链中的stdin读取时,为什么fgets失败?

如何解决当我使用0作为FILE *从rop链中的stdin读取时,为什么fgets失败?

我正在制作一个rop链,以使用stdin作为输入来调用fget,以便能够进行基本的stackoverflow。

但是我的问题是,当我以0作为第三个参数调用fgets(对于stdin)时,fgets崩溃于

 <fgets+49>       mov    ecx,DWORD PTR [esi]

其中esi是我控制的第三个参数,为什么会崩溃?设为0时,它不应尝试读取其内容,而只能从stdin中读取,否?

我的绳索链的有用部分如下:

fgets.plt
pop_pop_pop_ret
buffer
0x500
0

我不知道为什么它不起作用 发出的呼叫类似:

_IO_fgets(buf=0xf7f77000,n=0x500,fp=0x0)

谢谢

解决方法

您正在混淆stdio个文件(FILE*,这是文件的高级界面)和file descriptors(一个数字)。 fgets是一个stdio函数,并以FILE*作为参数。标准输入为文件描述符0,但在stdio接口中为stdin。同样,标准输出为1和stdout,标准误差为2和stderr

fgets期望FILE*处传递0(或任何小整数)会导致程序尝试将此值作为地址取消引用,这会失败(对于0(它是空指针,会因分段错误而失败;根据体系结构,不是字长的倍数的值可能会因总线错误或非法指令而失败。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。