pwn细节

send和sendline

read(fd, buf, count) 文件描述符,为0,从输入的缓冲区中读取(标准输入),通俗理解为从哪读,即使超过count也能输入到缓冲区;读到哪;读入字符数。

sendline和send都是发送数据,sendline会在发送的数据末尾加一个回车。而这个回车所造成的影响,是跟对应的输入函数有关系,输入函数有scanf(”%s”),gets(),read(),fgets(),这四个函数。

read会把这个回车(ASCII码也就是0a)存入到栈中

输入的数据先是放入了缓冲区中,再从缓冲区中写到了指定的地址,虽然sendline的回车没有被写进去,但是回车停留在了缓冲区中。接下来如果有gets函数需要获取输入的话,gets函数会因为这个缓冲区里的回车直接结束,不会从用户这里获取输入。

使用 gets() 时,系统会将最后输入的换行符(也就是回车)从缓冲区中取出来,然后给舍弃,因此缓冲区中不会遗留换行符(不用考虑send和sendline的区别)

scanf是从第一个非空白字符(空格 换行 制表符)开始读入的,就是你输入的数据,在按下回车的之前,输入的数据都会被存储在输入缓冲区(包括回车),当按下回车键之后,scanf就会开始从输入缓冲区里面读取数据,把读取的数据都传送到你指定的地址,直到遇见了空白符就停止。它仅仅是遇见空白符停止了,但是空白符以及空白符后面的内容依然在输入缓冲区里面。

fgets不会像gets那样自动地去掉结尾的换行符

read 用send
scanf 用sendline
gets 用sendline
fget 用sendline