NSSCTF-Web方向题目-WriteUP-NSSCTF-3876
North-Glory 2024-12-03
CTF
NSSCTF
WriteUP
[LitCTF 2023]这套题是Web方向入门题单,这是我的第26题
题目编号 | 题目名称 | 题目方向 | 难度 |
---|---|---|---|
3876 | 口算题卡 | Web | 1 |
# 题目26:口算题卡
# 题目描述:来点小学生喜欢的x 不会算错吧?
# 考点:Python脚本
# 预期解:用Python编写脚本
进入页面后,页面提示
__ ________ _________ ______ _________ ______
/_/\ /_______/\ /________/\ /_____/\ /________/\ /_____/\
\:\ \ \__.::._\/ \__.::.__\/ \:::__\/ \__.::.__\/ \::::_\/_
\:\ \ \::\ \ \::\ \ \:\ \ __ \::\ \ \:\/___/\
\:\ \____ _\::\ \__ \::\ \ \:\ \/_/\ \::\ \ \:::._\/
\:\/___/\ /__\::\__/\ \::\ \ \:\_\ \ \ \::\ \ \:\ \
\_____\___________________ \__\_____ \_____\______ \__\/ \_\/
/_____/\ /_____/\ /_____/\ /_____/\
\:::_:\ \ \:::_ \ \ \:::_:\ \ \:::_:\ \
_\:\| \:\ \ \ \ _\:\| /_\:\ \
_______ /::_/__ \:\ \ \ \ /::_/__ \::_:\ \
/______/\ \:\____/\ \:\_\ \ \ \:\____/\ /___\:\ '
\__::::\/ \_____\/ \_____\/ \_____\/ \______/
Welcome to the LitCTF2023 Verbal Problem Card!
You will be presented with 100 addition and subtraction problems.
Your goal is to answer all of them correctly to get the flag!
if you wrong, you will be kicked out of the game.
Good luck & Have fun!
What is 86 - 32?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
看了别人的题解,用的是Python写了脚本
from pwn import *
# 从pwn库中导入所有内容,pwn库常用于编写漏洞利用相关脚本,提供了如与远程服务器交互、构造payload等功能
io = remote('node4.anna.nssctf.cn', 28659)
# 使用remote函数创建一个网络连接,连接到指定的远程主机(node4.anna.nssctf.cn)的指定端口(28659),
# 后续通过io对象来和远程服务器进行数据的发送与接收操作
context(arch='amd64', log_level='debug')
# 通过context函数设置当前脚本执行的上下文环境,这里将架构设置为amd64,意味着后续相关操作按照64位体系结构处理,
# 同时将日志级别设置为debug,会输出详细的调试信息,方便排查问题和查看交互情况
io.recvuntil(b'What is ')
# 通过io连接对象调用recvuntil函数,从远程服务器接收数据,直到遇到字节串b'What is '为止,
# 目的是获取包含题目提示起始部分的完整内容
for i in range(100):
# 开始一个循环,循环100次,通常用于处理100轮类似的交互任务,比如连续回答100个题目,不过这里暂时没用到循环变量i的取值
line = io.recvuntil('?')
# 在每次循环中,继续从远程服务器接收数据,接收截止到遇到字符'?'为止,获取完整的包含具体运算题目的那一行内容,
# 并将接收到的数据赋值给变量line
if b'+' in line:
# 判断接收到的字节串line中是否包含字节串b'+',如果包含则说明是加法运算题目,进入该分支进行加法相关处理
a = int(line[0:line.find(b'+')].strip(b' '))
# 提取加法运算的第一个操作数:
# 先通过line.find(b'+')找到字节串中b'+'的位置索引,然后截取从开头到b'+'之前的字节串部分,
# 再去除前后空格,最后将其转换为整数赋值给变量a
b = int(line[line.find(b'+') + 1:].strip(b'?').strip(b' '))
# 提取加法运算的第二个操作数:
# 截取从b'+'后面一位开始到字节串末尾的部分,先去除末尾的'?'字符(因为recvuntil接收到'?'截止),
# 再去除前后空格,最后转换为整数赋值给变量b
payload = a + b
# 将两个操作数相加,把相加的结果赋值给变量payload,这个payload就是加法运算题目的答案,后续要发送给服务器
else:
# 如果字节串line中不包含b'+',则进入该else分支,意味着是减法运算题目,进行减法相关处理
a = int(line[0:line.find(b'-')].strip(b' '))
# 提取减法运算的被减数:
# 原理和加法中提取第一个操作数类似,通过line.find(b'-')找到b'-'的位置,截取开头到b'-'之前的字节串部分,
# 去除空格后转换为整数赋值给a
b = int(line[line.find(b'-') + 1:].strip(b'?').strip(b' '))
# 提取减法运算的减数:
# 截取b'-'后面的字节串部分,经过去除末尾的'?'以及前后空格等处理后,转换为整数赋值给变量b
payload = a - b
# 计算两数相减的结果,并将结果赋值给payload,这个payload就是减法运算题目的答案,后续要发送给服务器
io.send(str(payload))
# 将计算得到的答案(存放在payload变量中)转换为字符串(因为网络发送文本数据需要字符串类型),
# 然后通过io连接对象的send函数将答案发送给远程服务器,完成对当前运算题目的回复操作
io.recvuntil(b'What is ')
# 再次调用recvuntil函数从远程服务器接收数据,等待接收下一个题目开始的提示内容(直到再次接收到b'What is '为止),
# 为下一轮循环中接收和处理下一个运算题目做准备
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49