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

时间:2020-11-09 09:35:16

标签: buffer-overflow stack-overflow

我正在制作一个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)

谢谢

1 个答案:

答案 0 :(得分:2)

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

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