攻防世界高手区9(73-78)

[无关链接]

073 打开电动车
题目:截获了一台电动车的钥匙发射出的锁车信号,3分钟之内,我要获得它地址位的全部信息。flag内容二进制表示即可。

下载得到sctf.wav,audacity打开:

记录信号得到:
0 011101001010101001100010

PT2242信号:前面4bit表示同步码,中间的20bit表示地址码,后面的4bit表示功能码,最后一位是停止码。
从而地址码部分是01110100101010100110。

flag:sctf{01110100101010100110}

074 latlong

下载得到无后缀名文件,file命令判断是wav音频文件。重命名后audacity打开,波形和频谱均无可疑线索。选择“分析-频谱分析”:
可以看到在1100Hz和2200Hz处各有一个峰,猜测是某种无线电通信中利用数字频率调制来传输数据的信号。

同时找到原题的提示:Ax25 will lead you in the direction。
AX.25是国际业余无线电爱好者联盟为分组无线网制定的专门通信协议,可以用multimon-ng工具来解调信号。同时,为了直接解析wav格式的文件,需要安装另一个工具sox。在Kali中均可以直接通过apt-get install命令安装。

安装完成后开始解调信号:
root@kali:~/Desktop# multimon-ng -t wav -a AFSK1200 file.wav
multimon-ng 1.1.9
  (C) 1996/1997 by Tom Sailer HB9JNX/AE4WA
  (C) 2012-2020 by Elias Oenal
Available demodulators: POCSAG512 POCSAG1200 POCSAG2400 FLEX EAS UFSK1200 CLIPFSK FMSFSK AFSK1200 AFSK2400 AFSK2400_2 AFSK2400_3 HAPN4800 FSK9600 DTMF ZVEI1 ZVEI2 ZVEI3 DZVEI PZVEI EEA EIA CCIR MORSE_CW DUMPCSV X10 SCOPE
Enabled demodulators: AFSK1200
AFSK1200: fm WDPX01-0 to APRS-0 UI  pid=F0
!/;E'q/Sz'O   /A=000000flag{f4ils4f3c0mms}

flag:flag{f4ils4f3c0mms}

075 test.pyc

下载得到pyc文件,总之先反编译。uncompyle6一直报错。
C:\Users\Administrator\Desktop>uncompyle6 -o 1.py test.pyc

# file test.pyc
# --- This code section failed: ---

L.   1         0  LOAD_CONST               '=cWbihGfyMzNllzZ'
                3  NOP
                4  NOP
                5  NOP
                6  LOAD_CONST               '0cjZzMW'
                9  LOAD_CONST               'N5cTM4Y'
               12  LOAD_CONST               'jYygTOy'
               15  LOAD_CONST               'cmNycWNyYmM1Ujf'
               18  BINARY_ADD
               19  STORE_NAME            0  'str'

L.   2        22  LOAD_CONST               -1
               25  LOAD_CONST               None
               28  IMPORT_NAME           1  'base64'
               31  STORE_NAME            1  'base64'

L.   5        34  LOAD_CODE                <code_object flag1>
               37  MAKE_FUNCTION_0       0  None
               40  STORE_NAME            2  'flag1'

L.  13        43  LOAD_CODE                <code_object flag2>
               46  MAKE_FUNCTION_0       0  None
               49  STORE_NAME            3  'flag2'

L.  21        52  LOAD_CODE                <code_object flag3>
               55  MAKE_FUNCTION_0       0  None
               58  STORE_NAME            4  'flag3'

L.  30        61  LOAD_NAME             2  'flag1'
               64  CALL_FUNCTION_0       0  None
               67  POP_TOP

Parse error at or near `None' instruction at offset -1

test.pyc --
# decompile failed
可以看到有一些固定的字符串:
'=cWbihGfyMzNllzZ' '0cjZzMW' 'N5cTM4Y' 'jYygTOy' 'cmNycWNyYmM1Ujf'
猜测是个反过来的base64密文,倒一下:
fjU1MmYyNWcyNmcyOTgyYjY4MTc5NWMzZjc0ZzllNzMyfGhibWc=
解密:
~552f25g26g2982b681795c3f74g9e732|hbmg
hbmg往前移一位就是galf,猜测要倒过来再凯撒移位。再根据|和~的ASCII码与{}也正好差1,因此是广义的ASCII凯撒移位:
a = '~552f25g26g2982b681795c3f74g9e732|hbmg'
a = a[::-1]
for i in a:
    print(chr(ord(i) - 1), end = '')

flag:flag{126d8f36e2b486075a1781f51f41e144}

076 Avatar

下载得到jpg文件。能用的隐写工具全试了一遍最后发现是outguess。
root@kali:~/Desktop# outguess -r 035bfaa85410429495786d8ea6ecd296.jpg -t flag.txt
Reading 035bfaa85410429495786d8ea6ecd296.jpg....
Extracting usable bits:   28734 bits
Steg retrieve: seed: 94, len: 41
root@kali:~/Desktop# cat flag.txt
We should blow up the bridge at midnight

flag:We should blow up the bridge at midnight

077 Hidden-Message

下载得到pcap文件,wireshark打开。
全都是UDP流,追踪流也没有有效信息。继续观察其他内容。
注意到数据包的总数是80,再看到这一列的端口号其实一直在变。
将这一列的1和0记录下来,发现每8位开头都是1。将1和0互换,并每8位一组二进制ASCII转码,得到flag。

也可以用tshark输出UDP协议端口号后,配合管道符和Linux命令行得到每个端口号的最后一位:
root@kali:~/Desktop# tshark -r 8868f595665740159650d6e654aadc93.pcap -Tfields -e udp.srcport | while read port; do echo -n ${port: -1}; done
Running as user "root" and group "root". This could be dangerous.
10110111100110101001011010001100100110101001000110011101100110101000110110011000
之后同样互换0和1并二进制ASCII转码即可。

flag:Heisenberg

078 red_green

下载得到png图片。
全部由红绿色点组成,容易想到两种颜色分别表示0和1。先写个python脚本提取信息:
from PIL import Image

img = Image.open('C:/Users/Administrator/Desktop/1.png')
h = 780
w = 1024

j = 0
res = ''

for i in range(w * h):
    x = i % w # 横坐标
    y = i // w # 纵坐标
    color = img.getpixel((x, y))
    if color == (255, 0, 0): # 红色
        res += '1'
    elif color == (0, 255, 0): # 绿色
        res += '0'
    j += 1
    if j == 8: # 每8位转一次十六进制
        h = hex(int(res, 2))
        if len(h) == 3:
            print('0' + h[2:], end = '')
        elif len(h) == 4:
            print(h[2:], end = '')
        j = 0
        res = ''

红0绿1的运行结果,开头为0027001f;红1绿0的运行结果,开头为ffd8ffe0,是jpeg文件头。显然选后者。将运行结果在十六进制编辑器保存为jpg格式文件得到:

此外本题还有较为取巧的方法,Stegsolve打开原png图片后用Data Extract功能,选择Red的0位:
同样可以直接得到jpg文件。

flag:flag{134699ac9d6ac98b}