做题目遇到的两种 eof 信号需求情况:

  1. 发送 eof 之后,后续不需要继续输入(vnctf-White-Give-Flag
  2. 发送 eof 之后,后续还需要继续输入(mtctf-blind

eof 发送后继续输入

不用 mtctf-blind 做例子,因为利用 eof 绕过第一层之后,由于题目其他方面而无法 getshell ,用一个 demo 例子(来源)代替:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void) {
char buf[24];
while(1) {
if(read(0,buf,16)==0) {
break;
}
}
read(0,buf,1000);
return 0;
}

题目要求第一个 read 返回值为 0 ,也就是输入字符串长度为 0 ,才能到达下面的 read 栈溢出漏洞。eof 发送脚本如下:

1
2
3
4
5
from pwn import *
import tty
p = process("./eof_1",stdin=PTY,raw=False)
p.send(chr(tty.CEOF))
p.clean()

发送完 eof 之后,输入通道没有关闭,依然可以输入。

参考资料

eof 发送后不在输入

直接看 vnctf-White-Give-Flag 就行,输入 eof 目的是让返回值为 -1

1
2
3
4
p = remote(xxxx,xx)
p.sock.shutdown(socket.SHUT_RW)
# or
# p.shutdown_raw('send')

参考资料

与read返回值关系

特殊情况就是让返回值等于 0 或者返回值小于 0 两种,两种情况分别对应:

  • 返回值等于 0 ==> eof 发送后继续输入
  • 返回值小于 0 ==> eof 发送后不在输入