misc

ACTF新生赛2020 outguess

解压发现一大堆的文件但是大部分都没什么意义
flag.txt 打开后发现
flag在哪?
你Guess一下啊!这么一段话
猜测应该是图片隐写 要用到outguess
mmm.jpg的属性那边备注这么段信息

13.PNG

有个叫什么社会主义核心价值观的加密
解码一下得到abc三个字母
那就没错了
就拿到flag了ACTF{gue33_Gu3Ss!2020}

SWPU2019我有一只马里奥

下载下来得到一个文件运行生成一个1.txt 打开提示如下
ntfs
flag.txt
应该是ntfs隐写
用ntfsstreamediter导出即可

谁赢了比赛?

丢010 发现还有压缩包
文件分离 得压缩包 暴力破解是个四位数密码
拿到一张gif 逐帧分析第310帧有不一样的

25.PNG

用stegsolve red plane 0

那边得到一张二维码 扫一下就可以了

26.PNG

**HBNIS2018excel破解 **
直接丢010 然后查找一下找到flag is here 就找到flag了 这么简单?

ACTF新生赛2020 base64隐写

base64隐写的原理:

从Base64编码的原理我们很自然推出Base64解码的过程:

丢掉末尾的所有‘=’;
每个字符查表转换为对应的6位索引,得到一串二进制字符串;
从头开始,每次取8位转换为对应的ASCII字符,如果不足8位则丢弃。
在解码的第3步中,会有部分数据被丢弃(即不会影响解码结果),这些数据正是我们在编码过程中补的0(本文第三第四张图中加粗的部分)。也就是说,如果我们在编码过程中不全用0填充,而是用其他的数据填充,仍然可以正常编码解码,因此这些位置可以用于隐写。

解开隐写的方法就是将这些不影响解码结果的位提取出来组成二进制串,然后转换成ASCII字符串。
依次读取每行,从中提取出隐写位。
如果最后没有‘=’,说明没有隐写位,跳过。
如果最后是一个‘=’,说明有两位隐写位,将倒数第二个字符转化为对应的二进制索引,然后取后两位。
如果最后是两个‘=’,说明有四位隐写位,将倒数第三个字符转化为对应的二进制索引,然后取后四位。
将每行提取出的隐写位依次连接起来,每8位为一组转换为ASCII字符,最后不足8位的丢弃。

贴一下解题脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def inttobin(a, n):
ret = bin(a)[2:]
while len(ret) < n:
ret = '0' + ret
return ret

table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'

f = open("ComeOn!.txt", "r")
tmpbin = ''
res = ''
line = f.readline()
while line:
if line[-2] == '=':
if line[-3] == '=':
tmpbin += inttobin(table.index(line[-4]), 6)[2:]
else:
tmpbin += inttobin(table.index(line[-3]), 6)[4:]
line = f.readline()
quotient = len(tmpbin)/8
for i in range(quotient):
res += chr(int(tmpbin[8*i:8*i+8], 2))
print res

附一下base64编码解码脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'

def inttobin(a, n):
res = bin(a)[2:]
while len(res) < n:
res = '0' + res
return res

def b64encode(strin):
res = ''
quotient = len(strin)/3
remainder = len(strin)%3
for i in range(quotient):
tmp = strin[i*3:i*3+3]
tmpbin = inttobin(ord(tmp[0]), 8) + inttobin(ord(tmp[1]), 8) + inttobin(ord(tmp[2]), 8)
print tmpbin
for j in range(4):
index = int(tmpbin[6*j:6*j+6], 2)
res += table[index]
if remainder == 1:
tmpbin = inttobin(ord(strin[-1]), 8) + '0000'
res += table[int(tmpbin[:6], 2)]
res += table[int(tmpbin[6:], 2)]
res += '=='
elif remainder == 2:
tmpbin = inttobin(ord(strin[-2]), 8) + inttobin(ord(strin[-1]), 8) + '00'
res += table[int(tmpbin[:6], 2)]
res += table[int(tmpbin[6:12], 2)]
res += table[int(tmpbin[12:], 2)]
res += '='
return res

def b64decode(strin):
res = ''
while strin[-1] == '=':
strin = strin[:-1]
tmpbin = ''
for i in range(len(strin)):
tmpbin += inttobin(table.index(strin[i]), 6)
remainder = len(tmpbin) / 8
for i in range(remainder):
res += chr(int(tmpbin[i*8:i*8+8], 2))
return res

sqltest
wireshark打开然后导出为http对象列表
png28
发现这在进行盲注bool注入的语句
推断出正确的ascii值,在对一个字符进行bool判断时,被重复判断的ASCII值就是正确的字符

28.PNG

最后提取到:
102 108 97 103 123 52 55 101 100 98 56 51 48 48 101 100 53 102 57 98 50 56 102 99 53 52 98 48 100 48 57 101 99 100 101 102 55 125
转为字符串得flag
flag{47edb8300ed5f9b28fc54b0d09ecdef7}

GXYCTF2019 gakki

老样子丢010 发现还有个压缩包 文件分离 暴力破解
然后拿到一个文本文档

#2V0VI_05X$GygD3g@gYurMGim#1=)D_@Z(JcRevlyGq&N-dgPH8XXSGL{@9}zVmlmxv1vEwbqr)ea!YMI2lznoV_bMrXLbwFrgaiQYfsVN14weObXp)(ybmXjXuTkFuj1pG54!mij1){41gKmFL&Zgeho01PPEwE=rcsndRof$X7JBJ=CaNRGMjLY_-GiqlDHWaVk-XZ8lD5!kLb(OH%8u2LtQXX3QV{1Lh)LyGF#kpV$}GXRKla)u(pw(&ggmYU82HLWhJgngOjhwofkqqC{Hi)g!GXrY6=UQGvaeOIrVgjkGjgGRTY78Ol$w0&tzZ1t}z#c^t8GrskRcz9YKE)4B(U
一堆的乱七八糟的
字频统计 脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#-* -coding:utf-8 -* -

#Author: mochu7
alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^&*()_+- =\\{\\}[]"
strings = open('./flag.txt').read()

result = {}
for i in alphabet:
counts = strings.count(i)
i = '{0}'.format(i)
result[i] = counts

res = sorted(result.items(),key=lambda item:item[1],reverse=True)
for data in res:
print(data)

for i in res:
flag = str(i[0])
print(flag[0],end="")

27.PNG

跑完拿到flag
有一说一gakki是真的好看