[2023浙江省大学生信息安全竞赛技能赛初赛]小小数学家
本文最后更新于174 天前,其中的信息可能已经过时,如有错误可以直接在文章下留言

很简单的一道题,但是能学到Python的知识,在网上找了附件没找到,Github上面也只有决赛的附件,但是找到了代码信息,应该就是全部信息了,题目给的代码如下。

19+49=?
96-31=?
86-3=?
20+47=?
29+55=?
35+35=?
81+42=?
73-16=?
52+48=?
0+56=?
55-6=?
69-20=?
99-48=?
100-52=?
36+13=?
32+13=?
84-34=?
90-34=?
94-45=?
85+13=?
50-5=?
55-3=?
77+25=?
87-35=?
62+35=?
88-43=?
86-30=?
90+10=?
66-17=?
34+63=?
51-6=?
22+76=?
46+5=?
45+11=?
20+78=?
56+45=?
99/1=?
47+52=?
58+44=?
76-26=?
92-42=?
12+44=?
80-27=?
5*25=?

全部都是数学表达式,正常的想法当然就是全部算出来,其值应该是对应的的Ascii码,在python里面chr(),然后拼接字符应该就能得出结果了,问题在于数据的处理,一个个算实在是愚蠢的方法。看别人是怎么做的。

学习一个eval()函数,这个函数我一开始学Web的时候有遇到,那时候它可以执行函数括号内的代码指令,所以我们可以利用其上传一句话木马。

他可以返回传入字符串的表达式的结果,但其实这也是上面说的执行函数括号内的代码指令一样的作用,用代码来解释如下

eval("print('hello')")
#输出hello
print(eval("1+1"))
#输出2
print(eval("pow(2,3)"))
#输出8

总之eval()函数可以执行其括号内的字符串表达式,如果有返回值,则可以接收返回值后再打印,如果是一个函数,它会直接执行函数。

看别人的解题脚本

s = """19+49=?
96-31=?
86-3=?
20+47=?
29+55=?
35+35=?
81+42=?
73-16=?
52+48=?
0+56=?
55-6=?
69-20=?
99-48=?
100-52=?
36+13=?
32+13=?
84-34=?
90-34=?
94-45=?
85+13=?
50-5=?
55-3=?
77+25=?
87-35=?
62+35=?
88-43=?
86-30=?
90+10=?
66-17=?
34+63=?
51-6=?
22+76=?
46+5=?
45+11=?
20+78=?
56+45=?
99/1=?
47+52=?
58+44=?
76-26=?
92-42=?
12+44=?
80-27=?
5*25=?
"""
#多行字符串
n = s.split("=?\n")
#以=?\n为分隔符分割多行字符串,该函数会返回一个数组
#这里分割后n为数组n=['19+49', '96-31', '86-3', '20+47', '29+55', '35+35', '81+42', '73-16', '52+48', '0+56', '55-6', '69-20', '99-48', '100-52', '36+13', '32+13', '84-34', '90-34', '94-45', '85+13', '50-5', '55-3', '77+25', '87-35', '62+35', '88-43', '86-30', '90+10', '66-17', '34+63', '51-6', '22+76', '46+5', '45+11', '20+78', '56+45', '99/1', '47+52', '58+44', '76-26', '92-42', '12+44', '80-27', '5*25', '']
#因为最后一个元素的后面依旧有=?\n,所以最好会多分割出一个空元素。
for i in n[0:len(n) - 1]:
#利用Python的切片遍历数组中第一个元素到倒数第二个元素。
    print(chr(int(eval(i))), end="")

看这里,s是一个用三个引号包起来的字符串,这是什么字符串呢?这个叫做多行字符串,它的作用是当需要包含换行符或者大量的文本时,可以使用三引号来包含这些内容,而无需使用多个单独的字符串通过加号或换行符来连接

Python我们正常在字符串中用回车换行是会报错的,如图

当然可以利用\n的换行符来达到换行的效果,如图

但是我们要处理数据,它已经有换行了,这里大佬的Writeup就很方便,先创建一个多行字符串,然后再用spilt()函数,分去等号问号和换行,然后就可以用eval()函数计算表达式的值,然后chr()转换成字符,再拼接。

学到了

文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇