EVIOCGBIT(ev, len) 该怎么理解?
我们可以推断出,它是一个宏,它的前两个参数已经确定了,具体的功能由后两个参数(ev,len)来决定。Linux-4.9.88\include\uapi\linux\input.h
#define EVIOCGBIT(ev,len)	_IOC(_IOC_READ, 'E', 0x20 + (ev), len)	/* get event bits */
 
但这个宏能实现什么功能呢?我们需要分析下面这两段代码:
代码1(Linux-4.9.88\include\uapi\linux\input-event-codes.h):

代码2(Linux-4.9.88\drivers\input\evdev.c):
static int handle_eviocgbit(struct input_dev *dev, 
			    unsigned int type, unsigned int size,
			    void __user *p, int compat_mode)
{
	unsigned long *bits;
	int len;
	switch (type) {
	case      0: bits = dev->evbit;  len = EV_MAX;  break;
	case EV_KEY: bits = dev->keybit; len = KEY_MAX; break;
	case EV_REL: bits = dev->relbit; len = REL_MAX; break;
	case EV_ABS: bits = dev->absbit; len = ABS_MAX; break;
	case EV_MSC: bits = dev->mscbit; len = MSC_MAX; break;
	case EV_LED: bits = dev->ledbit; len = LED_MAX; break;
	case EV_SND: bits = dev->sndbit; len = SND_MAX; break;
	case EV_FF:  bits = dev->ffbit;  len = FF_MAX;  break;
	case EV_SW:  bits = dev->swbit;  len = SW_MAX;  break;
	default: return -EINVAL;
	}
	return bits_to_user(bits, len, size, p, compat_mode);
}
 
因此我们可以分析出:
- 如果我们需要获取 /dev/input 目录下的 eventX 设备支持哪些事件(EV_KEY、EV_REL和EV_ABS等),可以通过ioctl调用指定
EVIOCGBIT(0, size)选项来获取,例如: 
len = ioctl(fd, EVIOCGBIT(0, EV_MAX), buf);
 
- 我们如果我们需要获取 /dev/input 目录下的 eventX 设备支持 EV_ABS事件 的哪些功能的话,我们可以可以通过ioctl调用指定
EVIOCGBIT(EV_ABS, size)选项来获取,例如: 
len = ioctl(fd, EVIOCGBIT(3, ABS_MAX), buf);
 
len是读到的数据,EV_MAX是evbit事件的最大长度,ABS_MAX是EV_ABS事件的最大长度。
 .






![BUUCTF [MRCTF2020]ezmisc 1](https://img-blog.csdnimg.cn/6d4e55a5407c4c839c44252bbbd4d03f.png#pic_center)












