Category - 网鼎杯

> 谁说fastbin的UAF就只能用fastbin attack来做的 首先这又是一题典型的选单系统,提供增删查改功能,一眼就看出来是UAF了。 ![UAF](https://leanote.com/api/file/getImage?fileId=5b8106c9ab64417198000de6) 但是比较恶心的是下图的部分,程序写死了`malloc`的size为0x20,也就是说我们只能

beijing

ida 打开,发现没什么东西,就是根据一堆dw的值,在一个表里面选择对应的值和它下一个值异或,然后输出出来。

根据flag格式,看了一下,发现只要不和它的下一个值异或应该就是flag。

写个脚本处理一下

  1. def int16(num):
  2. return int(num, 16)
  3. key = '61 4C 67 59 69 29 6E 42 62 0D 65 71 66 34 6A C6 6D 8A 6C 7F 7B AE 7A 92 7D EC 5F 57'.split()
  4. index = '6 9 1 10 8 11 2 3 1 13 4 5 2 7 2 3 1 12'.split()
  5. flag = ''
  6. key = list(map(int16, key))
  7. index = list(map(int, index))
  8. for x in index:
  9. flag += chr(key[2 * x])
  10. print(flag)

结果是flg{mzing_beijing}
在加上三个a就可以了
flag{amazing_beijing}

advanced

ida 打开发现超级乱,还超级长,就直接去看输出。
把输出转成字符串。
根据flag格式,把‘flag’和输出字符串异或,发现异或的值有规律,45、44循环。

写个脚本处理一下

  1. import re
  2. output = '4b404c4b5648725b445845734c735949405c414d5949725c45495a51'
  3. output = re.sub(r"(?<=\w)(?=(?:\w\w)+$)", " ", output).split()
  4. flag = ''
  5. key = [45, 44]
  6. for i, x in enumerate(output):
  7. flag += chr(int(x, 16) ^ key[i % 2])
  8. print(flag)

结果是flag{d_with_a_template_phew}

spider(web)-jaivy

动态爬虫,Redis Getshell。8000端口存在apache2

http://3d0666de57964c4b865e02e4088a14ac5b0522f7daa94075.game.ichunqiu.com/
[图片1]
图片标题
扫描目录发现robots.txt,发现了目录get_sourcecode
访问
图片标题
修改http头也没有效果
最后发现是xss+ssrf可以读取到源码,读文件脚本
上传4.html

  1. <html>
  2. <head></head>
  3. <body>
  4. <script>
  5. var url="http://127.0.0.1/get_sourcecode";
  6. var aaa = new XMLHttpRequest();
  7. aaa.open("GET",url,false);
  8. aaa.onreadystatechange = function(){
  9. if(aaa.readyState == 4){
  10. var a = document.createElement("a");
  11. a.innerHTML = aaa.responseText;
  12. document.body.appendChild(a);
  13. }
  14. }
  15. aaa.send();
  16. </script>
  17. </body>
  18. </html>

可以读取到源码
图片标题
得到源码

  1. #!/usr/bin/env python
  2. # -*- encoding: utf-8 -*-
  3. from flask import Flask, request
  4. from flask import render_template
  5. import os
  6. import uuid
  7. import tempfile
  8. import subprocess
  9. impo

fakebook(web)-jaivy

注册一个账号登录,发现存在sql注入,进行了一些过滤,时间不够,还没做出来。
图片标题
?no=1^sleep(1) %23

minified(misc)-jaivy

把flag_enc.png丢进Stegsolve,调试发现red的0通道比较特殊,猜测跟0通道有关。
图片标题
于是把所有的0通道图像都保存下来(file-save as)
然后两个两个地使用Stegsolve进行Analyse--image combiner
最后发现alphe plane 0 和 green plane 0进行xor的时候会出现flag
图片标题

clip(misc)-jaivy

把disk问价放进winhex,搜索16进制49484452发现有两个类似png的图片。
有一个有完整的文件头,有一个缺了文件头,手动分离出来并且给缺了文件头的图片补上文件头。
图片标题
(按alt+1选定开始块,按alt+2选定结束块,然后右键即可另存出来到新文件,得到两个png。)
图片标题
图片标题
图片标题
把两张图片截图截开成很多块,
图片标题
然后一点一点地拼接到一起,最后看着图猜出flag
图片标题

全场0血的crypto,然而我相信大家都是卡在其中一步,就是爆破K2上。
没有拿到flag,这个解法假设K2已知。

enter image description here

题目要求输入三个字符串,m1 m2 m3。看源码可知,m3就是K2,5字节,唯一有关的信息是最后输出的h1_2,是m1根据一个固定算法得到的。最后的输出是一个md5,因此可以爆破K2

enter image description here

然而事实是,在整个比赛周期都没有爆破出来,从alphanumeric到printable,都没有。。。意思就是K2里面还有不可见字符。。。那全场没人做出来也就可以理解了

假设K2已知,那么temp3就是0。
为了让temp2为0,需要type2_1(m1)和type2_2(m2)的结果相同:

enter image description here

process就是第一个字符替换为它与最后一个字符异或后的结果,那么很简单,只要m1和m2最后10字节相同且最后一个字节都是\x00就可以绕过这一层。

temp1要求type1(m1)和type1(m2)相同,但m1和m2是不同的。这里需要md5碰撞的字符串,网上搜一下就有了。由于K1长度未知,需要填充一个固定长度的K1的后缀(或者说msg的前缀),使得K1加上后缀的长度刚好等于md5的分组长度即64字节,需要64次爆破。

enter image description here

题目存在一个明显的gets函数,导致我们可以不限长度地在栈上面溢出。因为程序还提供了一个fork的机制,可以让我们重复运行程序三次。 第一反应就是爆破canary,但是gets函数会为每次的输入都强制加上`\n`,搜索canary相关的文章可以发现还有一种做法是可以直接leak出某个指针指向的字符串: http://veritas501.space/2017/04/28/%E8%AE%BAcan

有点气,早点发现的话说不定能拿一血,名次还能进个位数,可惜当时跟permgame杠上了。。。

每次拿到crypto题目的python源码时都有种prettyfy的冲动,例如改成这样:

  1. def shitty_hash(msg):
  2. h = 45740974929179720441799381904411404011270459520712533273451053262137196814399
  3. g = 0x1000000000000000000000000000000000000000163 # 2**168 + 355
  4. for i in map(ord, msg):
  5. h = (h + i)*g
  6. # This line is just to screw you up :))
  7. h = h % 0x10000000000000000000000000000000000000000000000000000000000000000
  8. return h - 0xe6168647f636

题目通过上面的算法生成字符串的hash,把代码写成数学表达式:

H(c)=h0gn+c0gn+c1gn1++cn1g mod NC

ci表示字符,那么上式的变量部分只有中间的多项式。本来卡在这里了,晚上再仔细一查,发现这种通过多项式生成hash的算法叫做rolling hash,然后找到了一篇论文描述如何在N=2k的情况下生成碰撞的原像,不再赘述。