0%

ROIS冬令营第一周WriteUp

(1.16有更新)ROIS冬令营第一周Write Up

废话很多。。

web

[Week1]HTTPtest

  1. 这是什么?bp抓一下!这是什么?bp抓一下!这是什么?bp抓一下!这是什么?bp抓一下!这是什么?bp抓一下!这是什么?bp抓一下!这是什么?bp抓一下!这是什么?bp抓一下!
  2. Response里面可以看到:flag: I can only give you flag with the browser of ROIS_browser
  3. 由题意得,把Request的User-Agent改成ROIS_browser

[Week1]ViewSource

view-source是一种协议,可以查看网页源代码

  1. 在浏览器地址栏前面加上view-source:
    btw其实我是上一题刚做完顺手在bp抓的
  2. 可以从源代码看出来,它大概的意思是它用一串函数复合表达了my_flag,但是没有明确打出来它完整的样子
  3. 在< script>里面< /script>给它加个JavaScript的输出函数alert()
    alert(my_flag)
  4. 🤗🤗🤗🤗

Crypto

[Week1] 0&1

因为没学过python,所以不知道有没有简单的方式,我是最基础的思路

  1. 首先,先把二进制八位八位的分开,每八个转一次十进制再转成相应的ASCII码

  2. 显然易得,出来的是十六进制,hex解一下

  3. 然后可以看出来这一层是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
       import binascii
    import base64
    bin = '00110101001101010011011001100010001100110011100100110100011000010011010100110101001100110011001100110111001101000011011000111001001101010011100100110101001110000011010001100101001101100110001100110100011001010011011001100001001101010011001000110110001101100011011000110001001101000011011100110101001101100011001100110100001101010011100000110011001100100011010001100001001101110011000000110110001100100011011001100100001101000011011000110111001110010011011000110101001101010011100000110011001100000011001101100100'


    bins = [bin[i:i+8] for i in range(0, len(bin), 8)]
    # 将字符串每八位分割

    decs = [int(b, 2) for b in bins]
    # 将每八位二进制转换为十进制

    ascs = [chr(d) for d in decs]
    # 将每个十进制数字转换为相应的ASCII码

    str=''.join(ascs)

    print(str)
    # 输出第一次解密结果

    hex_str = binascii.unhexlify(str).decode('utf-8')
    # hex解密
    print(hex_str)
    # 输出第二次解密结果

    b64_str = base64.b64decode(hex_str)
    # base64解密
    print(b64_str)
    # 输出最后结果

btw,不写代码的方式:
二进制转ASCII
https://www.lddgo.net/convert/string-binary
hex解码
http://tool.geekapp.cn/hex.php
base64解码
https://base64.us/

[Week1]Aniely

这题我捋了一下题干,感觉应该是

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#!/usr/bin/env python3

from struct import *
from os import *
#from secret import passphrase, flag

#我完全没学过的知识告诉我。。呃啊完全看不懂啊救救孩子


#这段应该是将passphrase加密
def aniely_stream(passphrase):
def mixer(u, v):
return ((u << v) & 0xffffffff) | u >> (32 - v)

def forge(w, a, b, c, d):
for i in range(2):
w[a] = (w[a] + w[b]) & 0xffffffff
w[d] = mixer(w[a] ^ w[d], 16 // (i + 1))
w[c] = (w[c] + w[d]) & 0xffffffff
w[b] = mixer(w[b] ^ w[c], (12 + 2*i) // (i + 1))

bring = [0] * 16
bring[:4] = [0x61707865, 0x3320646e, 0x79622d32, 0x6b206574]
bring[4:12] = unpack('<8L', passphrase)
bring[12] = bring[13] = 0x0
bring[14:] = [0] * 2

while True:
w = list(bring)
for _ in range(10):
forge(w, 0x0, 0x4, 0x8, 0xc)
forge(w, 0x1, 0x5, 0x9, 0xd)
forge(w, 0x2, 0x6, 0xa, 0xe)
forge(w, 0x3, 0x7, 0xb, 0xf)
forge(w, 0x0, 0x5, 0xa, 0xf)
forge(w, 0x1, 0x6, 0xb, 0xc)
forge(w, 0x2, 0x7, 0x8, 0xd)
forge(w, 0x3, 0x4, 0x9, 0xe)
for c in pack('<16L', *((w[_] + bring[_]) & 0xffffffff for _ in range(16))):
yield c
bring[12] = (bring[12] + 1) & 0xffffffff
if bring[12] == 0:
bring[13] = (bring[13] + 1) & 0xffffffff

def aniely_encrypt(msg, passphrase):
if len(passphrase) < 32:
#如果passphrase长度小于32
passphrase = (passphrase * (32 // len(passphrase) + 1))[:32]
#则将passphrase字符串重复多次
#直到它的长度达到32,然后取前32个字符
#最终将passphrase字符串变成32位长度的字符串
rand = urandom(2) * 16
#urandom(2)是生成2个字节的随机数,乘以16获得一个范围在0到32之间的随机数(大概?

return bytes(a ^ b ^ c for a, b, c in zip(msg, aniely_stream(passphrase), rand))
#使用zip函数将msg,aniely_stream(passphrase)和rand三个参数进行拉链
#然后使用异或运算对拉链中的每个元素进行运算
#最后将运算结果以字节形式返回

#这里有百度:
#密钥流是一种加密技术,它使用一个密钥流来加密和解密数据。
#其原理是,它将一个随机生成的密钥流与要加密的数据进行异或运算,以生成加密后的数据。
#解密时,只要将加密后的数据与密钥流再次进行异或运算,就可以得到原始数据。


key = bytes(a ^ b for a, b in zip(passphrase, flag))
#zip函数将passphrase和flag这两个对应的元素打包成元组
#然后使用列表推导式将元组中的元素进行异或运算,并将结果转换为字节形式,赋值给key
enc = aniely_encrypt(passphrase, key)
#用aniely_encrypt将passphrase和flag加密后赋给enc
print(f'key = {key.hex()}')
print(f'enc = {enc.hex()}')

#hex加密一下print出来


key = '4dcceb8802ae3c45fe80ccb364c8de19f2d39aa8ebbfb0621623e67aba8ed5bc'
enc = 'e67a67efee3a80b66af0c33260f96b38e4142cd5d9426f6f156839f2e2a8efe8'

首先有两个东西,一个叫passphrase一个叫flag,但咱现在不知道,是咱现在要求的
咱只知道key和enc
key是:

  1. 用zip函数将passphrase和flag这两个对应的元素打包成元组
  2. 然后使用列表推导式将元组中的元素进行异或运算
  3. 并将结果转换为字节形式,赋值给key

enc就复杂了,enc是:

  1. 判断得到的key长度是否小于32,若小于则将字符串重复多次,直至字符串大于等于32,取前面32位
  2. 用上面定义的aniely_stream加密key(咋加密还在理解
  3. 生成一个随机数rand
  4. 将用zip函数将(passphrase,加密后的key,rand)拉链,异或运算对拉链中的每个元素进行运算
  5. 返回的值即为enc

我的思路:

  1. key和enc解一下hex
  2. 判断得到的key长度是否小于32,若小于则将字符串重复多次,直至字符串大于等于32,取前面32位
  3. 用上面定义的aniely_stream加密key(咋加密的应该不用理解太仔细吧(是的我没理解
  4. enc=(aniely_stream加密后的key)^passphrase^rand
  5. 所以passphrase=enc^(aniely_stream加密后的key)^rand
  6. 因为key=passphrase^flag,所以把求出来的passphrase^key即为所求flag
  7. 很不幸里面的rand是随机数所以我们需要爆破一下
  8. 大概是:
    1
    2
    passphrase = bytes(a ^ b ^ c for a, b, c in zip(enc, aniely_stream(key), rand))
    flag = bytes(a ^ b for a, b in zip(passphrase, key))
  9. 刚好题干给了咱一个itertools.islice()我们可以用它对rand进行爆破
    。。。好吧我承认到这一步我真不会了。。。我一头雾水学了半天(这里的半天是实指)没明白最后我去搜了我有罪
    1
    2
    for rand in itertools.product(range(256), repeat=2):
    rand = bytes(rand) * 16
  10. 然后最后如果flag出现CCTF的字样,则输出flag
    1
    2
    if (flag.startswith(b'CCTF')):
    print(flag)
    这一步卡了半天因为我一开始开头没有b,这混帐玩意儿老给我报错😅
    因为flag是一个字节串,加上b的意思是表示以字节的形式来检测

最后附上我的代码。。

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
44
45
46
47
48
49
50
51
52
53
54
55
56
from struct import *
from os import *
import itertools

def aniely_stream(passphrase):
def mixer(u, v):
return ((u << v) & 0xffffffff) | u >> (32 - v)

def forge(w, a, b, c, d):
for i in range(2):
w[a] = (w[a] + w[b]) & 0xffffffff
w[d] = mixer(w[a] ^ w[d], 16 // (i + 1))
w[c] = (w[c] + w[d]) & 0xffffffff
w[b] = mixer(w[b] ^ w[c], (12 + 2*i) // (i + 1))

bring = [0] * 16
bring[:4] = [0x61707865, 0x3320646e, 0x79622d32, 0x6b206574]
bring[4:12] = unpack('<8L', passphrase)
bring[12] = bring[13] = 0x0
bring[14:] = [0] * 2

while True:
w = list(bring)
for _ in range(10):
forge(w, 0x0, 0x4, 0x8, 0xc)
forge(w, 0x1, 0x5, 0x9, 0xd)
forge(w, 0x2, 0x6, 0xa, 0xe)
forge(w, 0x3, 0x7, 0xb, 0xf)
forge(w, 0x0, 0x5, 0xa, 0xf)
forge(w, 0x1, 0x6, 0xb, 0xc)
forge(w, 0x2, 0x7, 0x8, 0xd)
forge(w, 0x3, 0x4, 0x9, 0xe)
for c in pack('<16L', *((w[_] + bring[_]) & 0xffffffff for _ in range(16))):
yield c
bring[12] = (bring[12] + 1) & 0xffffffff
if bring[12] == 0:
bring[13] = (bring[13] + 1) & 0xffffffff


key = '4dcceb8802ae3c45fe80ccb364c8de19f2d39aa8ebbfb0621623e67aba8ed5bc'
enc = 'e67a67efee3a80b66af0c33260f96b38e4142cd5d9426f6f156839f2e2a8efe8'
key = bytes.fromhex(key)
enc = bytes.fromhex(enc)

key1 = (key * (32 // len(key) + 1))[:32]
#将字符串重复多次,直到它的长度达到32,然后取前32个字符


for rand in itertools.product(range(256), repeat=2):
rand = bytes(rand) * 16
#是的这一部分还没明白,还在研究ing
key2 = aniely_stream(key1)
passphrase = bytes(a ^ b ^ c for a, b, c in zip(enc, key2, rand))
flag = bytes(a ^ b for a, b in zip(passphrase, key))
if (flag.startswith(b'CCTF')):
print(flag)

虽然搜了一部分(而且感觉搜的部分是最重要的。。。)但是还是有努力再搜的(目移。。
说起来这是非预期解法吗?我完全想不到其他解法。。也可能我刚学,脑袋里只有xor所以是这个思路
不管了先去吃饭。。。

Misc

Two Dimensional

  1. 一团乱码,看起来像base64,随便找个网站解一下字符串,看到前边开头是PNG。。显然。。是png文件。。。
    2.找个base64转十六进制的网站
    belike:
    https://tool.hiofd.com/base64-convert-hex-online/
  2. 把结果导到winhex里面保存为.png后缀的文件
  3. 打开一看是个缺了一角的二维码,补齐就好了
    我不会说我ps没使明白最后是开画板画上那个角的。。
  4. 找个扫二维码的网站
    belike:
    https://cli.im/deqr
    其实我有QR_Research。。但是我从来不用,都是网上现找的网站。。

LSB

  1. 解压
  2. 由题意可知这是lsb隐写
  3. 用Stegsolve打开,Data Extract打开,勾选Red0/Green0/Blue0还有LSB First
  4. Save Bin保存为txt文件

misc套娃

base16转字符串
http://www.hiencode.com/base64.html
base64转字符串
https://c.runoob.com/front-end/693/
https://base64.us/
八进制(octal)转字符串
https://photo333.com/octal-to-text-zh.php
hex转字符串
https://www.lddgo.net/string/hex
凯撒密码(Caesar)解密
本题位移是10
https://www.qqxiuzi.cn/bianma/kaisamima.php
Base32转字符串
同第一个链接
摩斯密码(morse)
https://www.lddgo.net/encrypt/morse
Base32转字符串
又是一个base32
10进制ASCII转字符串
https://www.asciim.cn/m/tools/convert_ascii_to_string.html
阿特巴希密码(atbash)
http://www.metools.info/code/atbash209.html
字母大小写转换
https://www.iamwawa.cn/daxiaoxie.html

鼠鼠的假期

  1. zip文件打开
  2. 把里面的图片拉去百度识图
  3. 出来一个北京BAMN coffee的和一个厦门HOUSE OF RA
  4. 搜索上面这两个的地址
  5. 提交试一试