问题描述
我正在制作一个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(它是空指针,会因分段错误而失败;根据体系结构,不是字长的倍数的值可能会因总线错误或非法指令而失败。