Article Summary
GPT 4

[UTCTF 2020]Zero

得到附件打开得到

Lorem ipsum dolor ‌‌‌‌‍‍‍sit amet‌‌‌‌‍‍‌, consectetur adipiscing‌‌‌‌‍‬‍‬ elit.‌‌‌‌‍‬‌‌‌‌‌‍‬‌‍ Phasellus quis tempus ante, nec vehicula mi. ‌‌‌‌‍‬‍Aliquam nec‌‌‌‌‍‬ nisi ut neque interdum auctor.‌‌‌‌‍‍ Aliquam felis ‌‌‌‌‍‬‬‌orci, vestibulum ‌‌‌‌‍‬‍sit amet ante‌‌‌‌‍‌‬ at, consectetur‌‌‌‌‍‌ lobortis eros.‌‌‌‌‍‍‍‌ ‌‌‌‌‍‌‌‌Orci varius natoque ‌‌‌‌‍‌penatibus et ‌‌‌‌‍‬‌magnis‌‌‌‌‌‌‍‌‌‌‌‌‌‍ dis ‌‌‌‌‍‍parturient montes, nascetur ridiculus ‌‌‌‌‌‍‌‌‌‌‌‌‬‍mus. In finibus‌‌‌‌‌‌‬ magna‌‌‌‌‌‍ mauris, quis‌‌‌‌‍‬‌‍ auctor ‌‌‌‌‍‬‌‍libero congue quis. ‌‌‌‌‍‬‬‬Duis‌‌‌‌‍‬‌‬ sagittis consequat urna non tristique. Pellentesque eu lorem ‌‌‌‌‍‌‍id‌‌‌‌‍‬‬ quam vestibulum ultricies vel ac purus‌‌‌‌‌‌‍.‌‌‌‌‌‍‌‌‌‌‌‍‍

放在kali里面,用vim打开该txt文件,果然发现许多不可见字符,就判断为零宽字符,在线解密得到flag。

[NISACTF 2022]为什么我什么都看不见

打开附件后,放到010中发现文件头出现错误,补齐文件头。先用binwalk分析,得到rar文件,却什么都没有,后来分析,发现是;lsb隐写,最低位隐写即可。

[LitCTF 2023]两仪生四象 (中级)

题目直接给了一个程序。

_hash = {"乾": "111", "兑": "011", "离": "101", "震": "001", "巽": "110", "坎": "010", "艮": "100", "坤": "000"}

_reverse_hash = {v: k for k, v in _hash.items()}

text = "LitCTF{*********}"

text = text[7:-1]

binary_text = ''.join(format(ord(c), '010b') for c in text)#format(ord(c), '010b') 的作用是将它的ASCII码转换成8位二进制数字,前面加零以保证每个二进制数字的长度都是3位。然后,使用''.join()将所有二进制数字连接在一起,以获得整个字符串的二进制编码表示。

encoded_text = ""
for i in range(0, len(binary_text), 3):
    try:
        encoded_text += _reverse_hash[binary_text[i:i + 3]]
    except KeyError:
        encoded_text += " "

print(encoded_text)

""" 
encoded_text = "坤乾兑艮兑坎坤坤巽震坤巽震艮兑坎坤震兑乾坤巽坤艮兑震巽坤巽艮坤巽艮艮兑兑艮震兑乾坤乾坤坤兑艮艮坤巽坤坤巽坎坤兑离坎震艮兑坤巽坎艮兑震坤震兑乾坤乾坎坤兑坎坤震艮离坤离乾艮震艮巽震离震坤巽兑艮兑坎坤震巽艮坤离乾艮坎离坤震巽坎坤兑坤艮兑震巽震巽坎坤巽坤艮兑兑坎震巽兑" 
"""

这段代码是对二进制字符串进行解码的过程。在循环中,每次处理三个字符,也就是一个汉字对应的三个二进制数字。如果这三个数字是有效的,即它们对应的八卦名称在_reverse_hash字典中有定义,那么就将这个八卦名称添加到已解密的字符串Encoded_text中;否则,就添加一个空格。

这个过程中使用了异常处理机制。如果一个二进制字符串无法找到相应的八卦名称,_reverse_hash[binary_text[i:i+3]]操作将会引发一个KeyError异常。在这种情况下,程序将在字符串encoded_text中添加一个空格,以便在最终解密结果中保留二进制字符串中无法解密的部分位置,并且不会中断整个程序的执行。

最终,经过循环处理和异常处理,我们就可以获得解密后的明文字符串,它被存储在encoded_text变量中。

脚本

_hash = {"乾": "111", "兑": "011", "离": "101", "震": "001", "巽": "110", "坎": "010", "艮": "100", "坤": "000"}

encoded_text = "坤乾兑艮兑坎坤坤巽震坤巽震艮兑坎坤震兑乾坤巽坤艮兑震巽坤巽艮坤巽艮艮兑兑艮震兑乾坤乾坤坤兑艮艮坤巽坤坤巽坎坤兑离坎震艮兑坤巽坎艮兑震坤震兑乾坤乾坎坤兑坎坤震艮离坤离乾艮震艮巽震离震坤巽兑艮兑坎坤震巽艮坤离乾艮坎离坤震巽坎坤兑坤艮兑震巽震巽坎坤巽坤艮兑兑坎震巽兑"
text = ''
binary_text = ""
for char in encoded_text:
    binary_text += _hash[char]
formatted_binary_text = " ".join(binary_text[i:i+10] for i in range(0, len(binary_text), 10))

print(formatted_binary_text)
# 0001110111 0001101000 0000110001 0001100011 0001101000 0001011111 0001100001 0001100111 0000110100 0001101001 0001101110 0001011111 0001110000 0001110010 0000110000 0001100100 0001110101 0001100011 0001100101 0001100100 0001011111 0001110100 0001101000 0001100101 0001011111 0000110011 0001101001 0001100111 0001101000 0001110100 0001011111 0001010100 0001110010 0000110001 0001100111 0001110010 0001100001 0001101101 0001110011

这段代码是对二进制字符串进行解码的过程。在循环中,每次处理三个字符,也就是一个汉字对应的三个二进制数字。如果这三个数字是有效的,即它们对应的八卦名称在_reverse_hash字典中有定义,那么就将这个八卦名称添加到已解密的字符串Encoded_text中;否则,就添加一个空格。

这个过程中使用了异常处理机制。如果一个二进制字符串无法找到相应的八卦名称,_reverse_hash[binary_text[i:i+3]]操作将会引发一个KeyError异常。在这种情况下,程序将在字符串encoded_text中添加一个空格,以便在最终解密结果中保留二进制字符串中无法解密的部分位置,并且不会中断整个程序的执行。

最终,经过循环处理和异常处理,我们就可以获得解密后的明文字符串,它被存储在encoded_text变量中。

然后再进行二进制转字符串即可得到flag。

【攻防世界】适合作为桌面

binwalk发现zlib但是没有任何用处。

在stegslove中发现一张图片

扫码得到

03F30D0A79CB05586300000000000000000100000040000000730D0000006400008400005A000064010053280200000063000000000300000016000000430000007378000000640100640200640300640400640500640600640700640300640800640900640A00640600640B00640A00640700640800640C00640C00640D00640E00640900640F006716007D00006410007D0100781E007C0000445D16007D02007C01007400007C0200830100377D0100715500577C010047486400005328110000004E6966000000696C00000069610000006967000000697B000000693300000069380000006935000000693700000069300000006932000000693400000069310000006965000000697D000000740000000028010000007403000000636872280300000074030000007374727404000000666C6167740100000069280000000028000000007304000000312E7079520300000001000000730A0000000001480106010D0114014E280100000052030000002800000000280000000028000000007304000000312E707974080000003C6D6F64756C653E010000007300000000

16进制在winhex进制中转换发现具有乱码,但是其中有 1.py和module猜测为pyc文件反编译。

python反编译 - 在线工具 (tool.lu)

解密得到python文件,进行调整得到

#!/usr/bin/env python
# visit https://tool.lu/pyc/ for more information
# Version: Python 2.7


def flag():
    str = [102,108,97,103,123,51,56,97,53,55,48,51,50,48,56,53,52,52,49,101,55,125,]
    flag = ""
    for i in str:
        flag += chr(i)
    print(flag)

flag()#flag{38a57032085441e7}

[LitCTF 2023]Take me hand (初级)

打开流量包
首先搜一遍词条,flag,ctf,分组详情,分组列表,分组字节流。
在分组字节流里找到flag

%21经url转换为!%7B,%7D分别为{ },可得flag

攻防世界 Cephalopod

追踪流量包的tcp发现了png文件,放在binwalk以及foremost无法分离,利用

tcpxtract -f 434c8c0ba659476caa9635b97f95600c.pcap

提取得到flag。

也可以在tcp追踪流中复制原始数据,到010中进行还原得到png图片。

给了一个usbdata经过分析为usb流量

利用脚本进行提取得到

python3 UsbKeyboardDataHacker.py usbdata.pcap
ujkonjk,tfvbhyhjipokrdcvgrdcvgpokqwsztfvbhujkowazxdqasewsdrpokxdfviklpnjkwsdrrfgyrdcvguhnmkbhjmyhji

应该是键盘密码

键盘上 ujko 四个字符把 i 包围起来
njk 把 m 围起来
tfvbh 中间的是 g
yhji 围得是 u
则:
i m g u l f f l a g i s w e l c o m e t f j n u
分一下:
im gulf flag is welcome t fjnu

由于flag是残缺的则补齐 to

NSSCTF{welcome_to_fjnu}

[NISACTF 2022]流量包里有个熊

添加pcap,导出http得到一张小熊的图片,放在binwalk中进行分析发现隐藏文件分离得到

flag.txt有一个base解密得到

this is not the true flag!

打开rar文件发现两个 flah文件外面的没用打开里面的发现一堆奇怪的字符,rot13后发现似乎是图片的16进制放在010中打开得到图片。

发现了可能是盲水印,利用工具打开

即 NSSCTF{S0_clev2l_You}

[陇剑杯 2021]ios

(1)

追踪TCP流得到15字节里的日志。

发现 hack4sec。

testiphonex:~ root# ./ios_agent -c 3.128.156.159:8081 -s hack4sec
2021/08/28 17:53:50 [*] Starting agent node actively.Connecting to 3.128.156.159:8081

可知ip地址为 3.128.156.159

(2)

发现GitHub开源网站:

Stowaway

wget https://github.com/ph4ntonn/Stowaway/releases/download/1.6.2/ios_agent && chmod 755 ios_agent

作者名: ph4ntonn

项目名: Stowaway

软件名  ios_agent

(3)

(1)中得出密钥: hack4sec

(4)

这里需要先对TLS数据流进行解密

首选项,TLS 选择keylog.txt

数据流过滤为http2,然后对数据流进行盲注分析

37 34 36 35 35 38 66 33 2D 63 38 34 31 2D 34 35 36 62 2D 38 35 64 37 2D 64 36 63 30 66 32 65 64 61 62 62 32 5A 5A 5A 6A

hex转字符串 746558f3-c841-456b-85d7-d6c0f2edabb2

[CISCN 2022 初赛]ez_usb

tshark -r "C:\Users\86157\Desktop\新建文件夹\新建文件夹\ez_usb.pcapng" -Y 'usb.data_len == 8' -Y 'usb.src =="2.10.1"' -T fields -e usbhid.data > 3.txt
tshark -r "C:\Users\86157\Desktop\新建文件夹\新建文件夹\ez_usb.pcapng" -Y 'usb.data_len == 8' -Y 'usb.src =="2.8.1"' -T fields -e usbhid.data > 1.txt

[CISCN 2022 初赛]babydisk

打开后获得一个wav文件。经过提示,使用deepsound

发现需要密码,则确定是deepsound隐写

从网上找到一个脚本

#!/usr/bin/env python3
'''
deepsound2john extracts password hashes from audio files containing encrypted
data steganographically embedded by DeepSound (http://jpinsoft.net/deepsound/).
This method is known to work with files created by DeepSound 2.0.
Input files should be in .wav format. Hashes can be recovered from audio files
even after conversion from other formats, e.g.,
    ffmpeg -i input output.wav
Usage:
    python3 deepsound2john.py carrier.wav > hashes.txt
    john hashes.txt
This software is copyright (c) 2018 Ryan Govostes <[email protected]>, and
it is hereby released to the general public under the following terms:
Redistribution and use in source and binary forms, with or without
modification, are permitted.
'''
 
import logging
import os
import sys
import textwrap
 
 
def decode_data_low(buf):
  return buf[::2]
 
def decode_data_normal(buf):
  out = bytearray()
  for i in range(0, len(buf), 4):
    out.append((buf[i] & 15) << 4 | (buf[i + 2] & 15))
  return out
 
def decode_data_high(buf):
  out = bytearray()
  for i in range(0, len(buf), 8):
    out.append((buf[i] & 3) << 6     | (buf[i + 2] & 3) << 4 \
             | (buf[i + 4] & 3) << 2 | (buf[i + 6] & 3))
  return out
 
 
def is_magic(buf):
  # This is a more efficient way of testing for the `DSCF` magic header without
  # decoding the whole buffer
  return (buf[0] & 15)  == (68 >> 4) and (buf[2]  & 15) == (68 & 15) \
     and (buf[4] & 15)  == (83 >> 4) and (buf[6]  & 15) == (83 & 15) \
     and (buf[8] & 15)  == (67 >> 4) and (buf[10] & 15) == (67 & 15) \
     and (buf[12] & 15) == (70 >> 4) and (buf[14] & 15) == (70 & 15)
 
 
def is_wave(buf):
  return buf[0:4] == b'RIFF' and buf[8:12] == b'WAVE'
 
 
def process_deepsound_file(f):
  bname = os.path.basename(f.name)
  logger = logging.getLogger(bname)
 
  # Check if it's a .wav file
  buf = f.read(12)
  if not is_wave(buf):
    global convert_warn
    logger.error('file not in .wav format')
    convert_warn = True
    return
  f.seek(0, os.SEEK_SET)
 
  # Scan for the marker...
  hdrsz = 104
  hdr = None
 
  while True:
    off = f.tell()
    buf = f.read(hdrsz)
    if len(buf) < hdrsz: break
 
    if is_magic(buf):
          hdr = decode_data_normal(buf)
          logger.info('found DeepSound header at offset %i', off)
          break
 
    f.seek(-hdrsz + 1, os.SEEK_CUR)
 
  if hdr is None:
    logger.warn('does not appear to be a DeepSound file')
    return
 
  # Check some header fields
  mode = hdr[4]
  encrypted = hdr[5]
 
  modes = {2: 'low', 4: 'normal', 8: 'high'}
  if mode in modes:
    logger.info('data is encoded in %s-quality mode', modes[mode])
  else:
    logger.error('unexpected data encoding mode %i', modes[mode])
    return
 
  if encrypted == 0:
    logger.warn('file is not encrypted')
    return
  elif encrypted != 1:
    logger.error('unexpected encryption flag %i', encrypted)
    return
 
  sha1 = hdr[6:6+20]
  print('%s:$dynamic_1529$%s' % (bname, sha1.hex()))
 
 
if __name__ == '__main__':
  import argparse
 
  parser = argparse.ArgumentParser()
  parser.add_argument('--verbose', '-v', action='store_true')
  parser.add_argument('files', nargs='+', metavar='file',
    type=argparse.FileType('rb', bufsize=4096))
  args = parser.parse_args()
 
  if args.verbose:
    logging.basicConfig(level=logging.INFO)
  else:
    logging.basicConfig(level=logging.WARN)
 
  convert_warn = False
 
  for f in args.files:
    process_deepsound_file(f)
 
  if convert_warn:
    print(textwrap.dedent('''
    ---------------------------------------------------------------
    Some files were not in .wav format. Try converting them to .wav
    and try again. You can use: ffmpeg -i input output.wav
    ---------------------------------------------------------------
    '''.rstrip()), file=sys.stderr)

使用脚本获取哈希值,借用kali的john来爆破密码。

python3 deepsound2john.py voipNewRing.wav > 1.txt
john 1.txt

得到密码为feedback,经过deepsound解密得到key.txt

e575ac894c385a6f

利用ftk挂载。在回收站发现了

$RDWTTK4

根据key.txt分析猜到加密文件是一个veracrypt。将其作为密码得到一个“spiral”

上网搜索为螺旋的意思,而且是zip的格式。但是结尾和文件整体很怪。在网上发现螺旋算法。找到解密脚本

def function(n):
    matrix = [[0] * n for _ in range(n)]

    number = 1
    left, right, up, down = 0, n - 1, 0, n - 1
    while left < right and up < down:
        # 从左到右
        for i in range(left, right):
            matrix[up][i] = number
            number += 1

        # 从上到下
        for i in range(up, down):
            matrix[i][right] = number
            number += 1

        # 从右向左
        for i in range(right, left, -1):
            matrix[down][i] = number
            number += 1

        for i in range(down, up, -1):
            matrix[i][left] = number
            number += 1
        left += 1
        right -= 1
        up += 1
        down -= 1
    # n 为奇数的时候,正方形中间会有个单独的空格需要单独填充
    if n % 2 != 0: 
        matrix[n // 2][n // 2] = number
    return matrix

def main():
    f = open('spiral.zip', 'rb').read()
    s = function(87)
    
    s = sum(s, [])
    
    f1 = open('fla.zip', 'wb')
    arr = [0] * 7569
    
    for i in range(len(s)):
        arr[i] = f[s[i]-1]
    
    for i in arr:
        f1.write(bytes([i]))

if __name__ == "__main__":
    main()

得到一张png图片

去掉开头,发现有49个字符,经过怕方格排序,螺旋得出flag。

[GDOUCTF 2023]pixelart

图片打开后会发现许多像素点,在010中发现最后要求图片为320*180.

得知是将原来的像素为12*12提取。

from PIL import Image

im = Image.open('arcaea.png')
pix = im.load()
width = im.size[0]
height = im.size[1]
# 新图像的宽度和高度(每12个像素生成一个新像素)
new_width = width // 12
new_height = height // 12

# 创建一个新的图像对象
new_img = Image.new("RGB", (new_width, new_height))
for x in range(0, width, 12):
    for y in range(0, height, 12):
        rgb = pix[x, y]
        new_img.putpixel((x // 12, y // 12), (int(rgb[0]), int(rgb[1]), int(rgb[2])))
new_img.save('new_image.png')

得到假的flag ,再将得到的图片经过zsteg梭哈得到真正的flag。

CISCN 2018]Picture

附件下载后是一个图片,经010分析后没有任何发现,

binwalk分离两个文件其中一个是base64编码,发现

KP........90.Llã.|Z...N.......codeãÞ.ð.®Gg.Á¶.¿:ü.Ç¥-.2 «GÛ6Õ³øÝ*¦zÂþ¡.¨çIcÏ.ÈrÚ±"ÄÇWn~ÖdÄîñ\ö	y!H.íý.¬r).©{.¢.oí.êtK».TòfÿÃPK..?.......90.Llã.|Z...N.....$....... .......code
. ..........[Ã..ÚÓ.<.	..ÚÓ.<.	..ÚÓ.PK..........V...|...Ü.[Python 2.7]

>>> ¨}¨}¨}

Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    ¨}¨}¨}
ZeroDivisionError: ¨}¨}¨}¨}¨}¨}¨}¨}¨}¨}¨}¨}¨}¨}¨}¨}¨}¨}¨}¨}¨}¨}¨}¨}¨}¨}¨}¨}¨}¨} <- password ;)

>>> .

文件头是错的,应该是个zip文件,然后Unicode转文本,得到16进制吗,转换得到压缩包,密码根据提示,是一个py的错误提示。

然后解压缩后得到

begin 644 key.txt
G0TE30TY[,C,X.$%&,C@Y,T5".#5%0C%"-#,Y04)&1C8Q-S,Q.49]
`
end

搜索得到是一个uuencode编码,直接kali梭哈得到flag。

[安洵杯 2020]王牌特工

文件得到findme

Linux 在file findme得到了是⼀个 ext3 的磁盘 ,

在kali使用mount挂载,使用mkdir创建文件夹,然后使用

mount findme /mnt/c/Users/86157/Desktop/新建文件夹2/1 进行挂载。

发现了 flagbox key.txt lost+found

得到查看key.txt

key:a_cool_key
use Veracrypt

根据提示使用veracrypt工具

然后得到一个假的flag,提示回头看看。

然后使用df检查磁盘空间占用情况

 df
文件系统           1K的块      已用      可用 已用% 挂载点
none              3858572         4   3858568    1% /mnt/wsl
none            209716220 113044452  96671768   54% /usr/lib/wsl/drivers
none              3858572         0   3858572    0% /usr/lib/wsl/lib
/dev/sdc       1055762868  21173420 980885976    3% /
none              3858572       392   3858180    1% /mnt/wslg
rootfs            3855328      1936   3853392    1% /init
none              3855356         0   3855356    0% /dev
none              3858572       444   3858128    1% /run
none              3858572         0   3858572    0% /run/lock
none              3858572         0   3858572    0% /run/shm
none              3858572         0   3858572    0% /run/user
tmpfs             3858572         0   3858572    0% /sys/fs/cgroup
none              3858572        76   3858496    1% /mnt/wslg/versions.txt
none              3858572        76   3858496    1% /mnt/wslg/doc
drvfs           209716220 113044452  96671768   54% /mnt/c
drvfs           288059388 194470144  93589244   68% /mnt/d
/dev/loop0           8809      1049      7248   13% /mnt/c/Users/86157/Desktop/新建文件夹2/1

猜测是有两个文件被删除了。然后使用磁盘恢复数据软件 extundelete

extundelete /dev/loop0 inode 2

File name                                       | Inode number | Deleted status
.                                                 2
..                                                2
lost+found                                        11
flagbox                                           12
key.txt                                           13
.coolboy.swp                                      14             Deleted
.coolboy.swpx                                     15             Deleted

猜测是 .coolboy.swp

extundelete /dev/loop0 --restore-file .coolboy.swp

cd RECOVERED_FILES

strings .coolboy.swp
b0VIM 8.2
root
kali
~root/cool/coolboy
U3210
#"!
you find me
55yf55qE5a+G56CBOnRoaXNfaXNfYV90cnVlX2tleQ==

然后得到真的密码,进行解密。

you_are_a_cool_boy

[羊城杯 2023]ai和nia的交响曲

文件打开是一个流量包,直接过滤HTTP发现一个上传了png一个含有flag.zip

导出http进行提取压缩包,经过测试将两个08均改为00即可解开伪加密。然后进行发现有零宽字符的txt文件,

解密得到提示,我们不得不回去找到图片,导出后发现了是关于像素的图片利用脚本进行解密

from PIL import Image

im = Image.open('flag.png')
pix = im.load()
width = im.size[0]
height = im.size[1]
end=''
for x in range(width):
    for y in range(height):
        r, g, b = pix[x, y]
        if r>200:
            end+='1'
        else:
            end+='0'
txt = ''.join([chr(int(end[i:i+8], 2)) for i in range(0, len(end), 8)])

with open('13141243211.txt','w') as file :
    file.write(txt)

直接将像素为200以上的为1其余为0,得到文件

(>+UGfo+F^ia3#{JTlB:K:]@LW()ak-AaaTk`@/L&2V2M!(nh#",5&Tj=Mt0x*C%=9B4*G<USiGR"eOGW{SY%5TQBR+.-wtAgX#w]eiE1@JyL"WXfgcs|2I7kEW5_q`81U10k-3AkaLQT-0R,"BaHy'gsYBN@$_hBjY(Xg3|j1S:KJs`#.mMWal2e9<yA-?c5t(2D~T$K?ht|QuO1Q?T?mr|uj@o3kP(nDiDU7H;6EUv7L2mmFF1'<$O31Yc&%q+Ea$Y|/ixY&ta/ZL`&0[>sL[Up=2FP#6l8:~gM$u+nr&~cgWLExGQ._4BfVh/uIaJW0my0\E2SO'&D|8B"&gF?b.e^3gZA2!?*P<f}G?8Bpj:!-nc@zA7Uz5(^SOZj,u'+#Q'09xiE%tJ:5~vm{FX&I>d6*((+]2sl2s-Z4Fv!A!*|?eP$#-[01P]hia/B_iCS//CjE}HlLV),`&gkJ/iZR-WzS}R|{+Na|}3t;/$mhHiJk$%4rtS]wMpFV"vAe{p^^Y7/iDW,|1".@,$%o&$3.+,"$MKjhYoXJs*g_e!#F8y{kZV\,;jtW}S}7(VmRDQZ}Yu\7"8yuWXk^:b4)1,{wb;JN`^hL5M|71yrt;a<\9`whLz{Xt.UZ/}5U!@2r0^"UI!>gGk0<JiaDa;__IMSOgmaOI"72YHWlZ/wI9@gm!rkN$$f(Tn~,9$fn{GFK2qGjo$Zr^$mr0l0>+jd~<|ZepEBN]_pS4P,v`JQdKG?g*a#*0yID4ySTT|aqY8]Qc8TNa`.j\)5vq0!d60Acr&A1<h{.'{c%2SS'cq**,1yN*Kb#(0WLUlu\$O>p{=[q,zuGTTm5|=5AY/([9?vREwI^U>]mV7R@1XoQn1^hF_OY<bp"jD)3U_d{hI7})IR,GWWsa7yi@8tk*GSk8sIJ`m9]aY%qOk*zsUh0:Gg8)+R#I>j-O21dV%bgPfT%{+-oWs{._M)_qSg4wOS2Phz&lNQ9G%N*~]BRcbkUUwK)yc]P0tJ!Eg$^ca4(;p+*b<`~fXW\1Znp.<Ph#LR&#<eOY)8qd&28>sLhmi+:r=N`VLMz@}*TrZ6$9c;85(!":oa(\7ap1hSIdhV9,isjADx5C5s]#JpZa<7~valGCooV(t_i3DKZ>in#]C'nQde/[8x[Brl]_@;,5:g[8e7MG':,NT>EM+jFUgV6H[WMo$ec<i:#rLV:9hr;%Z,r6CK1y4K7(UUh$cvNPpa6T1Xh@+@.~ySa@|IBR?[';OtU(iKr=f>HxL=+Ivx{?shL%|UJcw765%qe&zBH/2EfE+cYZI(DI'{s~&,"[I>"EYCs0Sby={@QZ_hC.sr'0)_IL_Fp^;OXT4^;}*AlA(o_TuW7L92Q"+Cr3"LG!uNKb'Q^_:C~UX%\^%b{O8t&aDk:<tV*I%lI`]dE'@:+U:cR-!x6&1}HB&OIC7_gz.4;o5/)Qaj2T:Z)KdZ1<.UR=gnaa(;BOp@cpEcdZ&T^6>qab"kM#53S9Uv6,<pt@}A)G,:^#y*ciDz!s]@lQNLW"WHOa77@5#*<OrD0/`a^&kya<J9]|=]F,gHVU$,F81d'HQL!3.P9U~ym;B,PJQx;}Zo',nKwJDb"r-0=$2{wB<OwRO[:)cFuX*WU^MIIr4+-0Q.6,WnwLKN@ks1P}fSFMFdi)0.@mX+jm5wnkaa->]o,K]R2ll>V?@&!"zhW9`5!PF_+y,<>2FL?`>ongCE5"R^MT(Val_[+vjeBg+RX&6.[bx>ag,7T+02$rvn6r~{ru|HA2a@2|s*#2pj,aH0l;eI]B~vII"@QRY]5HGy{LE`QgFcNj@oV]s0GTq}MgIGX9AK>?UiFg)3&ez}TVH),QPA6#Tma<b<B/sc,fx{C4YG5M)]vAwR&,""]q:_l4!;UuE}iW"$hKFXL_ta=4Rpw8jrk+NwLVrmcl2"wozIQ/z/s7:*yz?2A^w.W7+-(<%-0'Q#+'u,jZOS^(5zU7Az@cn-!:jpB8?G}f<P*?!2AZg3^e.b?Fg&"B8|D&'OS2E\0ym0WJaIu/hVfB4_.QGxELWgc~&rn+u$Mg~:8l6#PF2=pU[Ls>[0&`LZ/at&Yxi/|Y$aE+q%&cY13O$<'1FFmm2L7vUE6;H7UDiDn(Pk3o@ju|rm?T?Q1OuQ|th?K$T~D2(t5c?-Ay'spA4f@6>qI4AM50nwWu4cQUNJF,~9<[7FHpRbv3BhY>gcz|Cl+.BT~WRqg_zKGo3J1!k~?z?:MNC;W;n:a_#N%fKMwy-Och"<SFGU(k:S>01)kEQ!GJ\${D>"j#@!ET,M^pOy/1ltV)4[CL&9B,}y'3^K[Dk>:Z/j`U^74Vr!m=Ix"\~tifk52Q%DP(O|s7:@Dit3pUw#n!J$HdK?*T9dQ?87APMvZ.we1$Zo#c8OAB+/=*9sJ6+rz.2x$PVgf'cn"eZ)i/DsWP.6tc#mtw7YFRhC?plb7i:<umD_>`@:H>u7H)ShVw7E*^rFS]NsCw8xR_Cvh#W8VJ[A+d9s^LE?f=1FE9<[MX(!p-}y"55Xy}3V%$OW#bj3uxes$d@V+9&E]MHR3>e9a)uMB1I?W}wxwWLd}~@-rRdPT/mxMXug}4vU[mK!cgN-DEt"s=6Xh3,'o;T'N|^|&oG6q&[VtkGl4_5F^Id&Ls]IaL.Jq+qx2!;>HPg>|Gs")Q2)h?<^D\?13&qgft-nVeZ!,KP"hKy3MMF1'$mk;p8f]38B(E'cK5o<OlA}SjG%:}Hv"4bz"'bL6o)=kLH'iZ3zLL%w*"ha|[+`}<IFBmN5/$hx,T6aB+>hvne3kmJ!keT8BZLd;A5&5m#Atj*H+GOBnjHu8~ca{,MKIw8v)W)JqX%_5C+EUu1%Li0$c.&o"7*Q`Vw7|!?Fg&"@V*)Z}^O~QD&2$^[>dviPMX2nALOJeMezZZ>le[S4K5|aM=@I/rQ~.PsYL8J!BY"5/:X"'/xid~I*v3ak.o<9<h+vr{|Okr9-UK_esHx_sR!sh9XNA>97.GI\;tk$,)U^,QSZ6fY/blJaOC5v-w-bH3R3],NbzV+J<c#~Q?!fWboyL?<W<6oM9x"}fJn{Ml@G/osv6FoK,6vTtGd)YgjhO>~Es8"]3-yIr50N(ixN~LPnTi]*o10C}u@1mj/@5?;8;)UzU6nvr$20+T'cFyu/VQ:h-v(A?EezI7{56okmTkqI:<L%kn$aX^az0-IcPQM/vU1q:53-nQLK',o+,z~DL1h,75w!^c@qH%~ey,blJ'0<{7df1P*I#:ftRcy/ITU_yJ@RKa&,ANJ[Lf?wplF'pG~hNt!KmkSS1E<p%m^V!djA(40KWte<*%9!Vb=-|/9,'*Zb/<NU5;p_*k359})7_wP<#~l{G_4nyK"!a%hM`+iXO;=xX6{@i?0^J'A%`H(}7{4pJM9Qa6>Gx6mg_f/x+ko.xGK8{>s&6+YqxHNDl_bNt(N=)(y*Z'VH&g9a-c4WGg@o)rfTdKPb[n|Qd:U*1-)tS2\r*p9wD%gd3+Plf(AIbiF\#)h*nnA{,jne2k.xI3f4fvD)?;r.q]86k=FE0r4=LN;4"oM]UgR;py&Vip.%*2d}*k0TCA~@3*ml}Y\&{P>+NSJmz]{O:=qEFWQ$"?IU'ma&@M7>_HG[lb]x(LMR'3wZ~hn}rG;,v.]\mc:k{@MW~th~r/S.{QtO.R1j6NR]`RQm6e|KsB<PJ2O9Qu0o@'_*OaB8[?Hi\>4k?!|`^,+g.~af1.qC+R$Ogf0D)S(/k?&3O.)[F;c?wzJ3'ETn1io`*ri;j{=M8}0Oh0{K;FgiGNK}gm@)*Z9h6AO{HpZq1&gC-4o[C=J:PNtU|)KbBy1<4UaCW?Id+{%TfPgb%Vd12O-j>I#R+)8gG:0hUsz*kOq%Ya]9m`JIs8kSG*kt8@iy7asWWG,RI)}7Ih{d_U3)Dj"pb<YO_Fh^1nQoX1@R7Vm]>U^IwERv?9[(/YA5=|5mTTGuz,q[<8RxbSuLP;ZIpcj"`{/Kox*_r'hG7WLM7!B0Eb^D(gmCbO1\@<~MJn@w+:+t)V0XqemlvlBg<v@<ZOI%ysOy:EWYaRx!P+a9hGN^>PIS_*6^g0b}(eq#Wzx8Q{xjd@')q.)UJNg*a2:e|D=hZ0Oh`vdBW,|>,&!;R""Slz]'YyS<^A\dGa'z]T5c`4W2,W\&0.b*.}fgJ{|+@R~zlO!jqx2`>=SB{J%_OhD~.v@B)=PQ>?%]UbFSv@8y[MzIWzG#.XURrbl0AQl-:?z6j<:HQ4CyoDMV'$7QX;<wPT}}Db`rX=>(/fMz,wtKG/.T&+hY??eh7XukTY\{@DrH?Af'K;UpV$Gh>O;U%IsEy/Z[(,P}P)O<Kt8"hES}9<2.hkkm3~3_i}cxq}C>He2mG&_W,vjIDN7mf,k2M2u>XBx}/+'Pgv]Z}RT+-[T[-`jZ@C:Yj{$}'x&uVg#3c@5,_VyeyVc+QpR&|hoK/rQ\{k[$+XL2)\X&mo/:gocY6-T`fm]PqSVW~Yc]C"-)C"*)>gb/BrU*L;[=?Id@aDTo).1s7S$}djU<TK+4tM!Ca-'Z}ZnKZ4;[uDV~^OLC%wGClT#1vqVq"JY`]5QUjrqj5Bnc(UA}Xs}%)f|cM!M|!@^Eu9V~@bzRvS="K:ecy4iqdtoM/RC~^E|xe&4x4{D+gAhgr+g@w4x1ZDj>7S4R*6fYd"*Z|Gz8X!",)5l$8->G>{cz[rAJ%.?d)v{C[-;uP*I~X]d_uk(=,QDW)*nYW3jU_jBQxfjK{up_d[J+'^YnB9W<NLF'yA(F<<Y'4Un2Otc6PaRVVs.R`n*g\-,&:VAdkhW%50ACQG|0`p_<a}=Hs#Z=~AS)GJownOZ]$Y5o"U=C"8;zD1e%"&~I|[email protected]~U"YlXv23%u7R}7x4#luu$e=dV$~p(h!HXs:;p#3Q[7MK782p1XYf,]@refg9SK_,T1{:i,Va'A!dA1_uG:@f*szb$RX^?-KXIcsi=V.W'xBCUl!M-bzT]he^X&2sq^%az%Yw?n;u@LS}N8ecJ9#qKD(n\3"]k+J8Y&:x}1(Y6sCi0aS>aY4{\[cW`_Ogpo+1J\@.^nz0W><(UlISO;~;Qq*q_`%;>L7TW{QX]jN>J(I#h*K|U}a-O9ldc_28wfD~@aN!A"QJDI!ws_MSfpV7il!dQhQi,]U@s/!&{1F[f9g[)_r|uw(jTQ)5k/&$T)2xa<'|6EX(V~g_M3-\a'T~!{g3,0?TJ..H-rH57NewY)=.Pt!Cz*Ph{=&d%,%&%w5;tqFx<n'bd}{]so{d%E2x8]wK1N"?1[bKkI^M,TzSYTB&2tTwYha)?F"+*sV3\WavL?#oqw0Q*6E/cZCt;}z|V.tOLm~NPYA&+.-_-^~@a`t)M2bo:/Ky~bM8J{:90<p|gak(I>fpG9<]Ch0xSU-Wz{X[LQ%w66;ii:D_+tzbbO8RTo!8y\XDX:S]!A%K]qQC?}X-{3T[#7;iP/kp8finXK1o.+I1:kh8U?l=%bj_v*L|-b*PJ0{#4,*8~p!mnfVBB~]P$Yhsc\To\\L4t-(iqrbg*N,5/KriTd"Q1>*Wh"}f[u..G3gr4(^GBb8v/`_Xn_GThg\q+w0H<HN@*@OsO8#kOD:qaAPQ,)HVT}ze&3)gFiU?>KA9XGIgM}qTG0s]Vo@jNcFgQ`EL{yGH5]YRQ@"IIv~B]Ie;l0Ha,jp2#*s|2@a2AH|ur{~r6nvr$20+T7,ga>xb[.6&XR+gBejv+[_laV(TM^R"5ECgno>`?LF2><,y+_FP!5`9Whz"!&@?V>ll2R]K,o]>[email protected])idFMFSf}P1sk@NKLwnW,6.ysdGtNzUKo*vPWIVv@AG'3fNr<4G9q7z%ec}^{ma2vU:RxMA?s'z\CaqH4)r5!yd!+y&CQW8L(')]gYxx,&y#zb543YXkRSzaK$9r#|-`Df8P8&E#^!!@tNtkw=z-NuZJk4?x.7Ki.&7q/[B3dF/t.@`FH?%o<N:uhXevjTsV}_otya$23SO$/F-R^qC:5\S>8TX$(78m6Z;9xiE%tJ:5~vm{FX&I>d6*((+]2sl2s-Z4Fv!A!u#T~kz^\B/k`E9>%7B8jFe3D^t9>Kn*knkbxh5&X^P7y8Kjwa%TrRfD6i(G'd9,)NNIVaw/:|#]T8;@.%0bA!-Z.-e4KtbrC)@;V/"^oECEk@tw32~=1<fr<"0NJs1FreM~8qsD(t&M07#hb"#w53+g0"t7,b`pZ`K;)ONg;Oxyg[,ns%[fB'-k!G~zI~7$nyKyV@::I-yR"'K#'~//7$F$DWSRO1t+lh_dRm977~F=7}df}S$AkLEJOrdU>#GjhGVc2^erLKYBE^Q&FF^A{k7{9!Mzna-%wLKoaas!(Z#nI}kJ%ZW@I5qf6k$~eI)`WC9KG.:up]{?-n5{ji5SfyQarKG8JXX&d}aRVsgQXb28HOR/tE/,Djo$:KGw-4z#_]%|/Q!KbE*Pw%NaY%CKA}7)?C}6'0^,-kLj31D=a?,{]`$>zM)F@S2#_A#f%LR1qIP#W]P$#;_W/-"ey/E0IA{"ZG@:;]7I#H%+o_UE#lgzx6,.<8%Vc&"g=w(yh\F=k{)h9#w{A8NFdv'2#FNX%;]}>-2udOrW6t6WexB9wLGMuD<bq!b/WzX";Be{4>%uNz1!UvRU|p%,QQJ"S%!4`4s7]1m,|Ai@glDLVPKBO!^M)%Ur`zYn(v/S]ms>RLb$>]`DF9HST7[Z\/H&1\U9vn\PUc<cu35aOgQa`qlU}^S4ijGq2KFG{nf$9,~nT(f$$Nkr!mg@9Iw/ZlWHY27"IOamgOSMI__;aDaiJ<0kGg>!IU"^0r2@!U5}/ZU.tX{zLhw`9\<a;try17|M5Lh^`NJ;bw{,1)4b:^kXWuy8"7\uY}ZQDRmV(7}S}Wtj;,\VZk{y8F#!e_g*sJXoYhjKM$",+.3$&o%$,@."1|,WDi/7Y^^p{eAv"VFpMV7R@1XoQn1^hF_OY<bp"jD)3U_d{hI7})IR,GWWsa7yi@8tk*GSk8sIJ`m9]aY%qOk*zsUh0:Gg8)+R#I>j-Ow]Str4%$kR>yzBr&#)&&dO3Ns,8*UzX}3Y2@qKca=,o9\_/aq:DOk#8OsO@*@NH<H0w+q\ghTG_nX_`/v8bBG^(4rg3G..u[f}"hW*>1Q"dTirK/5V@@@@[lkZYRHgN[[`j$<ovh?z<Gm0J1uC["t:I%P^4z}L^F7M:#=@W;m)Liti?k0#Vk_KRKoona){@>H<;W|_y;zv?wTiXdZ!7zGY9yze\2M~*,D;qdgfdx^Q-TijAewo/>Z;&'LmQxq%KZXw(;IBYilsk(&BHTVs[dWvGsiGgT^m0'R&hkWw9H}=rJ7S<xH~w3po@kYnLrNx=~*^zg"b\UZ^(H/HK}sxn5Ntir&."+p[N"L0mnWbLUHJ7-B;B=xtuQiSW[D)VT,\He|!4m_aeK$;Vz1q.kP6r@amI9g![!mdo1W.+rw.rG;,tQThh/Z=AOVu/k'$@Y4a>D]5oKC>z(-QecN(_.'sTY\?;cLN9!oEmJ>N'6$;O!8Y@@+4_zlV+x%5CAj6v:z:t&1e7Ox2Q//X;RzEyPlB,DV_'J,U(KNrd+o2]Ep&cSfDz_j!:{6?Q5e1%9h2m5mo``R2N!1(({k~Ew5vt=T:RIN3=EAe.qOzveS}hW,n,Vpx%_.?R3118)5~?z#Kd~pi@Rwr+8z-9Kw%G5/y,I{s\LN%4n}qz6Eh0(c`'2D:JvNpBYgv>KFXWjdu"ELBNog:9s$Mu5<oZw6ddb<c^="+Td=9lobo/kTsW*2}sgtI)m@[.EAFcH<4[;*+O+8a.\ySHMsbu>kwn()_\dOfEZ`LN`@u}Y"c:@j':%KA=4k.(nB<1_E{0+dsCfd*rSWRzv$I&di-u!+-S-#{S#Lk{Fqt=)&5(dy+}*2.4U[[3}.>PS+tM%Xujc`lTI}%T<!F&8M{y^:t\j,sj#\FTQj.lh)<\sQe?>BfeohQc(D&?OW5GxWRV0~wcjT[I>+LJB7)g"-r|agk_+R/PwwFezOlIC:iM{}sV3,b95b+$d%R,Ii%KRqO;'tg8|f(d&<J1^vSj#eo9fgejcJ]ag.Vkt^Md!@kQzG*9Z;^z,{?H_vuD0(;'|dl/q\mheqeS#'yFO'-K]ANF)OJfqjl/klmHSDBn$nT1JP*](+,6eyJ2C!$'5,k!A4Z-Co-b8IV\)3|_9h2f]Y0B/PJ&tkgvl6iHY?kI=&.rljW?xP(pgNKgu(24C>0AA\k6$W-|CIkADan*6qeQySQuzs"HGgW.Y|Ho{ytAz`MHIZ{+qOCVa?c)TYpJAmsogOvVEY?FL-0/}>&Z*{.xH{ZTqamc5h+H5{8ZEIhp:?uG}MR^/c3MiELE]g-=tzq3&E:Sh8_{JFf/1m2ji|>~ecI?J<im<zU\0itC[smaudyu1\?g'"GNf?%fw)[zo"VVT+<`a|{S,FBo1s9kWL;[1w!ibCAZ7@pXsxwDj=%<^3*_tro.\kf=I<(R3:jL9~-ni>6-@&NTv^Z#a>8vX**CdH@"ycer>E:Q[sKgCNB#CG>*-=tgrI1;$!0T4hv#Q'^7'h`iI)0wxh+!Nu5c|t|zQd!6;k~|_$s4.q%H,gQ6v5nFWL:npkNC>`L}2.A$J90i~vuDv<DkE/UxpiP<un-[!oO),m.g,.})6osh+xd&!.$A>S6x?3mG>deR(#7$kI9d;O``U<1{Z|_Y3O^!MI~A:N[`ghfL$"kJrAN/xna]K4len?7v&nI.,N<i;5k{!ju5Q^35"M$RY-{Z#}w#zu.|VPg]mR|FPRRD4STn_-r)|wu3i|FeSWz|/yI\}w6DD(Xu9!Vgk^["mY^cqc^t#N{D~@o+Lxvd-#4UjNuB[5xMFkiE9g{~7@#0@M5ebybmo{-Xh3n5nKnW81>y3boBD(eh_VI0z#";v(1q=/#9&!3;TB'&d,_c}Dv^<wUO?A-[@41(cgh7Xfg])E#fcXrM$P|8)vJA4Vd)Ib<HX@wy/NIR1:x1ZbTr3(,84HJtk*>J5}W8{1NMr#\eu5MmGAjc6gtQ<q8uehf02Z82hwH!F`(xic.Y#in|8I'Z4!<f+.v$"g$wV3]xYB6Jb32Kl>xRVA#}l}]3'DJHV+5fv&>8NnR%a\ln>$X9-8XSb>At;Q7Y#"uy2fB.%.u)+#qRN1vv;J0-tru-nLPfWKF$th2/cKj,"@*WWnAA^Wks._kbi:@&8N7`wz$V18yzt<bMO.m68WMC#]Q:n$a2SrCQ=8_`agUy_od(c*N,`:_R8Y6!eS?v]PPA"T#nAQyV/E.oWBSn[6|ugy*CtN}-><]c;GIn7AF}9Z{'Z-D$UMs8i}c.4.0},@e8g]PVu9xe?@'0T)Ees#<-%/^+"w*#GQ"SsyG5OHRF'oIvPWsVyV+Q@hSz@tiVH'xeKa6^uHXsMS/VR\/RVG`v/Y7_`LCtq&T{E$13hsneuo,T]^7<cLJ"KTxK2>0rz2n+YX/WP_8uR<9FX:U0L`;=_[wo+G,Jf`K!lS5-aZwO_O/59.!i]w>mwWsE?u:6?fjj'9a$u.+WCyKRSE*8YSAOE2JfS7!5?31_r:HSGKt(aPG/gFI*ke?zwVl/U{s>v;C"o(oF|y!3*'$Qnl,lo"|*A9uRn/u}*Q:G=UTsL.=;Z5bb@7hI0aL+CL]g_'_b~D,rQNX$3Mv[ffpN8}5qCdC5?.Vqg?pXuAWs2cfCA4.kmJR>TvL28$0|nuQJ=Gnq[q]6*rQWH?A:Qgq2}PXyX\n@boY}~7/5Vvx2k<vRn3VVM@1hT|}iES0QdTJ{3cOe>:[Sl!*?^9N!q36'hn0>IFB,*X+GmaD\@x#Z(MPxdR%meK1*oKa3>C_1tYa%/,Ux#GIb=G3gfw]f&WJd#]:EA9L~k<&q=5A1ZunZ|8o.h*}lfJQ1>4#(gC+c(.saD{Q7Wnb^!$(~}>d4Pwm}I]1lzLL`A0UyMP^(=bsvoG(3|^~@-olB(e5\6LYQO[={{foG<=Vv&3$VS`|lG!%k>"FHNa-pL^#0i0OW"bO0[qUX6RL?%RC~hDD{,7jv>rRg,4qJ>d"o%f{57gZ1]&i'qDmn0O25@5[~YNGU@qYg7X"?s[e*'./Td\c4h*5<B>*/2=6p:U?xe/-kawuW-E:5DhS-z#I~a-(OFrCH+fkT29a/%G3`B)"`]cX~gv(IQwy4yA)>`PZjU21[:R4"hnvpKS>(AJJ_oo!CDt(twsTWJ}*T'}h}|G=qf)\hP?dVG1%bWB&>AS$]w&L-Edjn';xeWiSUZwi{t)cDpZisa"d#;R^&=vUjhE}uvil}]+>|Ngm}B!kLrzsK%8+X?osMd}z)`U|nYNG/qUg7mtxHd]YF;<D}>|}Ff/}plCyl8h03q;l:IB&xn5{j'DXV+|,bPyIpXE*!kAczFSIS},T1ngkh1J;UivW;ia~LQVY<fDMF/c4b~uSJ.6$8|+^*s8m~+!3#hR3y8w<2pk{aA]EQ1:WF0!\p5k-jD<c?;kcQ-uTA`3Mn)l0N3%D=OKIBVVaQ<{s}a)Scq(kNsIP3%wR'h*Zs~Eo??]NMpSfI1-`#-u5S%cn{|/N,F,]xnuKxA\I+?wNGfKUP+wfVmax}hhxdD+Iq@"HY-%<(-+7W.w^A2?zy*:7s/z/QIzow"2lcmrVLwN+krj8wpR4=at_LXFKh$"Wi}EuU;9v,3}]T?"^X0ZpgS`W8'5Do8Z.Hj9{DnMqIgh/.IFBLX]eR(^X*mYPg5/T'Dw~ir$L90vQr9eZTx4Fa^(X1cE}Sey3vN!.GO/N,!'''8nOVq6q&^8{B!&}~8~|kr7yg"y2h^=2>/f7JOQ$t-g@*x+0V6ZkaF[l{-6"G)_U[n;|2G{,Ff$G?Q~;BLu|+~r+vP`f'XH\VzKLqt~J#.3^ca^"}`B}mzh<x:qx},ZgFdYAO\VJRbVkY^Q3)1X6}QE)+r.8?i%kqZsvx?0"T#}_:=R4=cb+K9nc\nx+h!H1fneyAK[%dA=B}9`--e9^y7o"&)s4xyGlMx:!,]o==qoq}\30o%),eA[S(JZL*`Axw-`!(rro:C-(F;>kxsc$yOW[}$jziv>o<}Td!hZk#-Aw)\JcWu._zSoD[Bs4,*8~p!mnfVBB~]P$Yhsc\To\\L4t-(iqrbg*N,pUdAL-A(8m`*iKXnvh{DU?9G!tEK(9?:7qE),0w=>n#^3UtA$.o5QCf!YLLdtp2fH6wmKBT_;LcMy-rcJ{V%`hXr;Kn-@oL^#3X(\ACA)L-i9@dA[Bq87W,>;m?JCxKxM+>-^.r])g+!nSb&Y^%.^WQKA_/:|$vRLs>X;0oeQGjeq}M3eXydb;!l,U8k+Jj9JpQ088x@JCtD:orzE!}M`(?*<z+ruS)5C:rLLMFrr3dAG%DHWOOG?\rmg-!n@(-6q$bk-hid.~Vlbc@MU>mXyQ8tG/Pq/{P-MA)qT_?.#Q'7+&&)GA?jOS%e'w"Cs`;}/v6{)W2PGd$0lqf_s.\>#OyQeDShm\G}&`c?N3ACE)T(a*HGz?h@n^<Y\XVA#U"30T0oOIMOT,T&l%Hg?:]s,J-QlJ;@<jdd|IgvN|Dde0m_+0<tU67V/zr3}4}.sR&D-xS)wEVx4/*?}~_xa?gr|=XYs[="HtL*ySSX_2\}'T3(if]`DRJ!$Jnq?5R#t|(>KN+@'E0d`}KRfI+`m]^Y2,s!%AeFDVK8*fr9sn5Pk&'wGHWSeN&A&k+fsS[<(!bK6K-xs0!(Vd}pTxlktNj&Q68Ks#.}(1Vp#?~}(T<P,yC4,#\}r0]_t{+l!9n'!%q#Vw<>n.C|!fY=0k9Rj3UE;RuV%.MZ*R\Ul'C}.5&Ll"T>xd]M2-cE<tn3'Cb4bWDC(S)#:-Z7];'c$Utw{K&rT0r?^.RT8ehhKK|s#0Y{b>-O[Tq'l\}l86>U-Ci0ky>#A17A%5xeYxT2gMniqK$oq>_fT&|n%2YMIvXx]MjG'n?TQ@h2{{|]w-3~lx)CwAhW{]`45cN?%/u%S|evS8_ajV:{Jd~gE"JNtQ+E$v\{HSazrlcp2<"%uFBQI:}G+fapf~kK`a],/HxUPm>anO+27(W+/z.`*+h[4~]YNT-JiHhm$/;t3}|aN+{|R}SzW-RZi/Jkg&`,)VLlH}EjC//SCi_B/aih]P10[-#$Pe?|*F,N/|{nc%S5u-#`-1IfSpMN]??oE~sZ*h'Rw%3PIsNk(qcS)a}s{<QaVVBIKO=D%3N0l)nM3`ATu-Qck;?c<Dj-k5p\!0FW:1QE]Aa{kp2<w8y3Rh#3!+~m8s*^+|8$6.JSu~b4c/FMDf<YVQL~ai;WviU;J1hkgn1T,}SISFzcAk!*EXpIyPb,|+VXD'j{5nx&BI:l;qk@+0|3&("iJ{2P=a?y4y,$|P>x%j`ufTrzIo6.*\#)A$/r.+.hr5/(e-"6#Qb]DgKPL,I42EWGT5Z&l04V~D;C<Q?D7(9timf!0I|giHoF+?ksNnbh@lpC^:r~Il:I29[,zh_R/qc\x}%W-3Og1'[oX2Ja9}9u'sk4|xP`'A]4I;)xK5&0xtQ1zrNYwz9[nBPMc"yiqR#dl0}B0|Mzz(e:tt%hY5,$x`BRcYk1|/D\q4VE'l0_dK,aNo|;R$5#=a,:ndKLU.[R!HPqmBx^t8.Iw9_/=384`XZ;geX(eD<,Ne9>{9L&M[D?4q(xF"3N'`$xqFXKW'TI!?lC}6aSOQjh4r-a'#}J2fN2%[UuI,zO'{*Kk)qcAo6B4[pT@@$W7%'qOwD!F>\e<<N\L[01f)1ns_v(N<|?[hA7Ho|*I=qt2gjjN7uUiib>n>'A['`|:fa0MfEMpIp*vj$o@(Z=,nKdNYqiD>:*jo"x?;^4brcOr0'\(||NRei]6~7M0;R,@`#4K]SBHNO,Q.0"GvCjoe+DWJJ2u7BX`Y@@^}:Ru'Aa9,bzBWfKsPFpDYNrt}LE9m9;gfO`g/GhENGU7.V1TK[FM5P}"{6]H}&2d9zr'2m6W%pPT{?|Z(gD@({<pOL<]:sD<;:*uOzTc446&?jVbd(62X:\{FA7=0R^H>t\n(s*3Z>6I/6fzyy#0^VHYPx8hI+9A\:"4RD3sASeVj6B0w}T0=R@=jxup/f"}qi_b~<{ohmV|cd7ib8\a`BQUt33y,uC|*o3%U''<PmbFB|p2W]KQJiIMmm9qDJsI`U?7,E>IN3%#=J*mH\gQL9P&ZT8w\N<hxyg;O4"25"R|J^pah#_L0`A>qi1GnX%+bWX/?'`O-?|CG@:^pV5P[!-d_Gm;<T3(s2w;z|,5L.Ls@J$o+Km`2fh|:c;9*IWO;RG%`VAHZ4$LH`!O'=_bmC[t=Jr;D:`|)U0Sa.R%#Gd\s:zqDT/ji&,SA"ukz2Eb<UO*pGs)</HJs!m~AH9$}zU;n40@@a~\X}U=M/%pztF.,x\p4Z%!%9h:/bbw=~ui>j6XSR5$P]7=v>ilk,Ah$?rDB1/zs7=,o,d)!~8[2?6ACOn>0Qb~RZ|yKjp]ZKF]YDE.mnh7Ad&#{=lftV0bEZin{pVI'w(I|_{X?K)tUfGF~YF2P1G8rh[+K,>=yNLeEI~<l/n?:dB<ru1%@i2^baZ7MW]s|vYa&o(sO=[C8wuu9:5Vl]Y"r>iS0EUg(S,WT|kZ"I+:XL-rG)?JfE0gemMb'0JzCL^TIN:FP?91a^<6"zo{)0]{r(~Lt5b,/EN[Cb9BZ,t,9&ixRx%WVa+Tq$skBQp&:(,hGnfqr*OpS:&)4Ou(\qF>Z/ijB0g@p}Kc#R>1lV/]>NPfJxe=V$:rPDZW-"b"ED<v_?&oYQtNe%EE,n+%ptZ+r':=afWCfK(p6RPzrZvp;2=KpNSV?1hZ%WY&^c&O1o6yu>;C$ePdv]F!iD,S;c-oB5Q)uPn;]V~OS.UFaazIBmc4-F"vO)$oAfnctJ#PgbAMKC'K>7;y2D{@@L)UjftonL@D@Rc'X3Gp\PbgB{251PZVuC?"Zd7CaHD^Lb;_@t>t\:|d!-8i!,F4)V,&p\sr^*{sc5]q:N`,;mN`@!j5"g)R$6[y`}F}bgPh%@#(l75*x\w2I3@>#+&l-Nv}+e'!m#6iVo*Blk3a@U"<o2I'1FnOIC9IpW_A`DMA-RImvKD"M#J'J((#P|JI!4O<I$SRGz[uSid,@))?x<Qzy`"QUJSR4g6T7Jtjd9BEK5otC51RB3K$vE`F}&[VgN9(@W#u1v-Sre,aKVGa#':7F@4^VxZ[HvYo28y\T(5^lC7=nt|#sko&+$2x"7,qXN/*-?U$sarYL>.(|V!c?GD@i`$M6>,EIr3:3Rmys!zY,^K/#/(t2Bx`hepDW@FrSgFKnf/mDh(M)b-%we*JG4Bp/]f3d5XwHp1=y{=ww}KoY_b!=sdvF@<*#6-]Lw:X9GGvz.jsYx\wBoOBQEV^-KJ#n:.+,Pd.',j*vYL7^n(x@|{TxF{zQO%cP=6wmk|ad\mi%6Z6`Ojwx;lB.`ns.W:ZYkf~2=JIf.*7FDqH8=Ev:L$w2*HblTJd"RrZ;\z\A0NthC'=\U/hKByC;I~hOtwuM@OucT:?DSAB(5|~bNa?^6(wv2/)8?P^s6E~hx=Ey{uH6,MBrw&{GnO(`4~(p=+n{|U3V4,rkV>kk4""u*8W-=we3t[LOCa]HL)Lo&wGB^qyq]p!^r6x4#yA0I;oBxa)\XYz:Fn42wE]e2?]#&G4tV{OZ:\,Brf-4X//}Nf/mU,8%gJoc{:kTCa]A2,d"?MHIsL|I5.$r}O78Q}L|Rf5+3!RF'67P~yJOi[>t5go#w4glpNi-ooVf-3|7):_S!1rF'NK^8<eq55kitROUYjs~KKvM(+IQYfax-h#mQ#$ew</,}9)O[v"ZIIE0K8jM-m88\-R_3DI<ON4F+bcIyOj&)YmI(Bv>8r7iSpv8hyf8yC~Yzt!dN4((((wzyCX2MQiC~]9uyN%][~o7&%Vaha`oTx:.ED2k|PZayyu|E4.f$>ZxCaYA%7dBbGS;$>SD;MeXf7-m[zS7a{(XseoZOrOr)R<nLwfglIp2t[%`%]S+W6rlrzeC=}}n1<!enCDLeR<Zg%4M[2KXiD(NNWj9{Gq0Jv>4PZ|ae8mOc7ADizK(Bu#eX!Q`6ldA3sA3Wek}fy-_>i2L1ASiJbozcO];`>R~!qN3n4PvF$fOJQQ==oWF<{GY{Iam:]Q]15bimqI*2c*j=~o>MQP9'k-r(:Q1D/*SL)@id*M[63*\iBAY+%?=Wuq%iI=a*b{@AT|[dTGV~Z@L|"ksGCzeL=47yD`Q-ou:NG,;4'm#LiA5^95vw:y8#D-Ux&y9IZWq/]cE"m;G>ckkFeBKm|@l5r5},!:KN5j/:oLs#t+Uk`@d_S2EvA{Dn2~m*RuNHocfsg~nYk@op3w~Hx<S7Jr=}H9wWkh&R'0m^TgGisGvWd[sVTHB&(ksliYBI;(wXZK%qxQmL'&;Z>/oweAjiT-Q^xdfgdq;D,*~M2\ezy9YGz7!ZdXiTw?vz;y_|W;<H>@{)anooKRK_kV#0k?itiL)m;W@=#:M7F^L}z4^P%I:t"[Cu1J0mG<z?hvo<$j`[[NgHRYZkl[@@@@V8sIJ`m9]aY%qOk*zsUh0:Gg8)+R#I>j-O21dV%/c7-OhJX]/z,x;,/Y:NMHq3Zs<kcc0zy3]'Vi)dp,0|\RjsC:lB=qe93[Vhz9ue49`fpaf+G}:IQBFu%"<2pclrzaSH{\v$E+QtNJ"Eg~dJ{:Vja_8Sve|S%u/%?Nc54`]{WhAwC)xl~3-w]|{{2h@QT?n'GjM]xXvIMY2%n|&Tf_>qo$KqinMg2TxYex5%A71A#>yk0iC-U>68l}\l'qT[O->b{Y0#s|KKhhe8TR.^?r0Tr&K{wtU$c';]7Z-:#)S(CDWb4bC'3nt<Ec-2M]dxg,k+U/1=0ht-A8Bs5pI%RToLBGUZ6[iDswtYC?w.5yR&RGr|:g0Dt-'T%b]'j/TJ5ViS'!),d?~bT4t9c=N@`[VX>ANj&lkobv\wfEP^1FMVG~B3.Gw'ZR'E$>DDO|"p9(#c{SzCG%>>SPL6#-~0wW+gna8!77kNTR{VDfoPjFhE>7]?6J)EW@!Xui/B/Veqs(Ylm6_q|u$F,]xnuKxA\I+?wNGfKUP+wfVmax}hhxdD+Iq@"HYOgv{>Wzm7a-zZt`_R5M1VFXcq[7aZbg*OXQ&00S6A}<o~UA^:r!:I:9T"Hx+|"n#l<=iiRDPmhAQCQ:X!!^LP6o{s8LKwsQ*P9>pD<z~P,h>Hp87kYU**QWtFo0y(X/Yy1+kj:Tb47PNyF8'D7t\R8)z~D&^U2^xhY0]##MU4MNIi|!Lekkw<=gm}4i&G<JQ,R.[`M=b`qC2@hG^J=K,UQO79R:40'd*DL/]D\p)dG>$`Th~,ocK7v8QcWp~I;6d3J#g{)rp3<"r^P-oR;vP]CXei@A>GxT!C*]';(NU;zi.:M\(H{PF.y(t);@2P+zL!f,33d0Ss7Xf^J"Wq<>7,olu'p;MW@}D)B_*QATa+XvIDH#@N&0/V)*ft7UC:>C^"X!_0wb~Tq5~+U*iEw>IqNI|83N<O=>',NCcqC=7eo1zm?M0!j)JEB2Y7Uk:?^Mi7dc#?d/pyarO]a)W1r~lYx}B4nY)n5mDkp)Z@is*xn?xp.B@`Pn?6g\'_8QKuJSLOtYEDYDM9Y(?I=s^:j#J[@ZDb9~HWk;=X&nPb`cJHL9ofUTIDThWlL~O`l&8?4i_/av-Xg89&wR\e}bFx_(-$bmNLyiRZ"TO2:X-vkg6G'F!|)HyStkhP|nXH?5OzrFPh_`^MS<qRzP!7Rk$+~sl{-k+mj\Z"f^N~5:XgzcDLUYi^ac^3.#J~tqLKzV\HX'f`Pv+r~+|uLB;~Q?G$fF,{G2|;n[U_)G"6-{l[FakZ6V0+x*@g-t$QOJ7f/>2=^h2y"gy7rk|~8~}&!B{8^&q6qVOn8'''!,N/OG.!Nv3yeS}Ec1X(^aF4xTZe9rQv09L$ri~wD'T/5gPYm*X^(Re]XLBFI./hgIqMnD{9jH.Z8oD5'8W`SgpZ0X^"?T]}3,v9zy8{]o2GfhQ'h([F$W&4nQV):_.~3|pU<5%5J.`94eu9zhV[39eq=Bl:CsjR\|0,pd)iV']3yz0cck<sZ3qHMN:Y/,;x,z/]XJhO-7c/#{0JP*b-|L*v_jb%=l?U8hk:1I+.o1KXnif8pk/Pi;7#[T3{-X}?CQq]K%A!]S:XDX\y8!oTR8Obbzt+_D:ii;66w%QL[X{zW-USx0hC]<9Gpf>I(kag|p<09:{J8Mb~yK/:ob2M)t`a@~^-_-.+&AYPN~mLOt.V|z};tCZc/E6*Q0wqo#?LvaW\3Vs*+"F?)ahYwTt2&uF(F:OTK=u,h%a@^Je+Z065N:w7{(KU7Q<DGl3R@hmqA:jO=_IYU8]%(:!cQWR%%CCjuC+1CL,Y0O3&}<)%4S[mHZJLl:lAJd/9jW+b*J]"]},asAg65~aYh97~yVL{|$(:sfKGz<)P'NvDtI3rJ,k{p'U}R<sjZ"<IMNk[YUKbH6L)6Ymxc;+u6@]L^aZ{,kv{"LMiF8}z^Qw@^[MOuZu^`0Hg:s'o_h2/L.^d^XVHN6Dn]5L4D-9q4+4Rx5GYH7M<L3;Fc&Q]e}bwe9hRu;K-V)wuRuDC`2PQf0Y/'%{b@aXC(r2!ASTMVS\i+rrXLvuMKwoPrpse}{:-7Uf#-5=NTbUELFhPoD^=B5yN}n>dCha{`X1VE#XNTO&c':+&u,v"_D'PKn)jBwaAVPFSzGcyel@=BHUBon<M_sDf4V?.I0\w>=%p''[,F.ys=-(UY"D?u~:AQ[BhyK!JT%-5;^)ujH3WJcCQ!?A)o.0Zwe&d[HIW7Y_}P?#Oll1"*SvQbMA-Pbc`Zun@0UPOYXBzeK4~PWcxyw!KLV2z67jR7MFvhCfCn1MxL/1YbyS1Zo@1;E<UT]i)+Yz,v@\tzRD,}}#wx8PPrV(&zz#lvteD=|4^_eHcgLL]-Xs"1Hd'Uuh'32$)E#Rtt{;'mT+N=>y3.hC2z'!*YTJ(J\e|]SHkl>t@OMf-m;#Q*ZACm;p%Vk;j(aSqsRaNuy1jni>&Lhv+dh)L5=vXSetcL5m\-)6XmtiR$/G^fCs+H-|!4z"Bf_cgD'P:@;pGjdG.;$SAPeVTt;E=Cet|RwkH}r%\nDR,<yC$R7hOM@*^r9Yy%_2UFrm[}NAiPET0'T&J(~(=VaIH86/*Ur&\kvt5AX=QL(J6eh[NLRX$`Xs)YVItC<Z3lV!#E^\wnPHZ^xYrb=qcg$YD,e&f2Zxx"=<<`a9Ur=s*ZQpPf+P^<&MSDL,nNvWTNQ^qLTwFp`DK'<X$;9/b2/0#3GNb0V*jLPdz9ii%Q$BKAO{kBp=GtOdF!Yr#<=m88]W&l:yw6zH<^55_2+}wQkrC(8p.E.QS|@|CyS"(|X?=u&6!&]Xzt(K?&2]d*FSI[8P_B#0^lqs]*|CBL!W>*Ct_&'[DJ#1Irx@d{3{DE`pc+Ju~(17fpb'#hvj9GVx@D3j,~Uz/g^C:0Y~t<^"vlPAf2Pbmz<G$<'Hp:3S9Nh*<9__U6<$wu`P+C_o*sF-oEU4Li!6$OCw|e}6,.PR\79c>o{,I;%;2y3\PPgJ@x[s-<5Dkfz&#5x5&e2o-CwgC[#/(qrgF2lZmTM`p([@WZ=D}TFw2:?c9;U/oaS$IiC+`&h\Vf#@*[I`]WNJI7Z\`8?`Tv-cuCqKt,#Z6N,HhLKww3ofL6V#l6Y':\\%'ZWR-:0V2u?{@$[EFx<_Gnfcd-Eq]RG-:S4g"Jjl!5E.DS@8]5&9g=EZJ9=7wZxs(rh34.$N<h'0JG'3t*BWm&y[bSDYixEcObyONkmkvw#^^MY'F5^Q>*+{&`/nK$*.}[N*>kr`AvRd,^z<,>c~t=.ZUiV{uOgdonK@3Y4@eHKd(3kk;f@y>DrlZF`zoJEA00r}1fnA0md^A&N8K5p|(1`:{qd3~j1gym7Cz9s31'zVj~{%YX2(S.\=|A+H,QMU&5B.Fc|4@I&Bg]\4y[#E#b'TZ4OQ:e<5wXj,DI_b9[`EZEhIN9m1X[,+u@Vj3~]_5FvG~iJ5(WYZUYy~*4;/e8'iT)b[t%WY:<'5wM%POKpNzE@_88j$|0TB,S^:}NAzJ!e:)};LbJE:g@YwT8NI{6GPbnqDvpz}.B5:1:?,4}HNQquraP["]bqan)xGh~9'.XY0uwPh{$niiC)p%VTafV$qB&j,#*oU>k1au1Vz:RI6_pprCAGTw~co=fzvK_%&9L}XZ'P@Oa*/eWU3zHI;,i8;9f\Ij@RSGk:C<<q(d|t4;+3\'rQDI}Z'<D&n]f!gLGphN6f,'#M*8;(pPnidXiAk50.*yDWT2`.vBd6Gt04Cd/bGa-bM](H{.6sr$9|k[ns^C~Vf$gtT(Z-Pe5w'!#|b@(,U60#79B.sy.eyO[LR3/.aXE~Ikik(e:r5)g?I1$2c8iK&n@bex&6uSA'AX)|qdgw0aamo?5?rJJ$KjPugN(s-''2%,9SqUB9Jj3|Rlq>5>sp>:0+a"K`bc-8|j9=+q8K#b4g^wo$qb,c,+[QTd[WMxm<Pauxy?njZ5cb<UCzhLX4b9BOX{oye?tlGh?5Ci`/6c:V-_wIJxd1?}yc/7N9wHBYNNkHH\:Se,SEr;[d?7&sZ-r]+|qwDgB*'Y_dn"09$6qV1zu_*EyD}>R6e#r|#7.6o#{ap/yZOrsG"iTp^Lz.E,l-Fw16"H[9[_Ds1l:_?Gt.s%Q^D#EcNK?]#SW*PODu=xI*&FK#"./\'cfSVTQ;XThq#.y0yen+S|."hpCs;.&d5(WR)oWCJRieLL.(V?cphmPSy3e|'8o49vLo0T;AxP#%<vz[JFF6ThbHHz-@*r'ykknnAbm0^9<3+oO]:$x$nzxeOfC(xnBINLazt\k,o\HBKQCH+owm6fjHDyr!5v!@oC_)O|`%aPB)m53PH2]MzR-}Gbfw7&c3cMZ8xnl&PPBRI/Gg9RZeKe-n>6sM;GwD7V#)A]:7gqnNnEw!^O&qWqbOw[e&FMS'KubO&IEm`l?gO@ANZh&7/wQo.h;R^n_0DO6nFZs55F3K)&F3T4B6DJiU-g@Ow@I05ZphBa|6czi(W)R>ChszLP>el|>x=.~OWAo6o>d\XStHs)>>>>>>HINT:BV1wW4y1R7Jv&&FLAG1:@i_n1a_l0v3S_

HINT:BV1wW4y1R7Jv&&FLAG1:@i_n1a_l0v3S_

可以得到一半的flag,然后BV1wW4y1R7Jv是一个b站视频,经过发现是讲解摩斯密码的,而

00:03 C
‬‌‍‬‌00:00‍‬‌‬‬‌‍   A
00‍‬‌‬:21 O
00:03‍‍‌‬‌‌‌ C
00:00 A
00:‌‌‌‌‍‌‬‌21 O
‌‌‌‌‍‌‬‍00:09‌‌‌‌‍‌‬‌‌‌‌‍‍‍‌‌‌‌‌‌‬‍‌‌‬‬‌ G
00‍‍‌‍‍‌‬‌:00 A
‍‍‌‬‬00:12 I
‍‍‌‌‬‌‌‌‌‍‬‍‬00:08 F
00‌‌‌‌‍‬‌‌‌‌‌‍‬‌‍‌‌‌‌‍‬‍:00‌‌‌‌‌‌‍ A
00:20 N‌‌‌‍

应该是对应的时间所带有的字母。

于是得到flag NSSCTF{@i_n1a_l0v3S_CAOCAOGAIFAN}

空白格

文件打开什么都没有,根据提示发现是空白格

Sublime Text

一个软件:Sublime Text - Text Editing, Done Right

将由空格,制表符,回车组成的不可见放入该软件可以看到空格,制表符,换行符的区别

在线解码 whitespace在线运行,在线工具,在线编译IDE_w3cschool

[鹤城杯 2021]A_MISC

直接给一个压缩包,010观察一下,不是伪加密。结果直接爆破得到 ‘qwer’,然后给出一张图片,发现ihdr出现问题同时感觉图片不全,直接爆破crc修复一下宽高。

得到

得到一个流量包,打开post发现是sql时间盲注的过程。

直接tshark导出

tshark -r file.pcap -Y "http.request" -T fields -e "urlencoded-form.value"  > data.txt

urlencoded-form.value 是 tshark 命令中的一个过滤器表达式,用于抓取 HTTP 请求中的 URL 编码表单参数的值。

得到

然后脚本提取

with open ('data.txt','r',encoding='UTF-8') as f:
    data=f.read().strip().split('\n')
flag=[0]*50
for i in data:
    num_start= i[73:i.find(',',73)]
    num_end= i[i.find('=')+1: i.find(",sleep")]
    if num_start and num_end:
        flag[int(num_start)] = int(num_end)
'''
巧妙的点是不用判断索引的值。
'''
print(bytes(flag).decode())