ASK over the air

テキストファイル ask-over-the-air.csv が与えられた。

内容を見ると、time,I,Qの3列の数値データだった。
そこで、gnuplot でプロットしてみた。

A text file ask-over-the-air.csv was given.

Checking what's in the file, I found three-column numerical data that consists of time,I,Q.
I tried plotting this using gnuplot.

set datafile separator "," plot "mis-ask-over-the-air/ask-over-the-air.csv" using 1:2 replot "mis-ask-over-the-air/ask-over-the-air.csv" using 1:3

plot 1

拡大すると、単位時間ごとに絶対値が大きくなる部分と小さいままの部分があることがわかった。

Closing up, I found that the absolute value of the data in some units becomes large and one in other units stay small.

plot 2

プロットにマウスカーソルを当てて切り替わる間隔を測ると、0.004046 ~ 0.004937 で14単位あるようだったので、 間隔は 6.364285714285716e-05 であると読み取れた。
そこで、

I measured the interval of switching by putting the mouse cursor on the result of plotting. As a result, I read the interval as 6.364285714285716e-05 because there are 14 units between 0.004046 and 0.004937.
Based on this, I added grids using this commands:

set xtics 6.36e-05 set grid

としてグリッドを追加し、観察すると、{ のASCIIコードである 01111011 を表していそうな部分が見つかった。

Investing the result, I found a part that looks standing for 01111011, which is the ASCII code for {.

plot 3

そこで、プロットから読み取った閾値を用い、この間隔ごとに1を表していそうなデータの数を数え、過半数だったら1、そうでなければ0に変換するプログラムを用意した。
その出力に対し、CyberChefの Drop Bytes で先頭の数ビットを削り、From Binary で変換すると、flagの一部が得られた。
そこで、時刻にオフセットを加えて処理できるようにした。

Therefore, I created a program to count entries that looks representing 1 based on the thresholds I read from the plotting result, and to emit 1 if what is counted is more than half of elements in the unit and 0 otherwise.
I applied "Drop Bytes" to remove some bits in the beginning and converted using "From Binary" on CyberChef. As a result, I obtained some part of the flag.
Seeing this, I added a function to add some offset to the time to the program.

decode.pl

オフセット0、0.00002、0.00004、0.00006 では7ビット、0.00008 と 0.00010 では9ビットを削って変換すると、意味のある結果が得られた。
これらの結果を組み合わせることで、flagが得られた。

I obtained meaningful results by dropping 7 bits with offset 0, 0.00002, 0.00004, and 0.00006, and by dropping 9 bits with offset 0.00008 and 0.00010.
I obtained the flag by combining the results.

FLAG{you-can-decode-many-IoT-communications}

WaniCTF 2021