- Renzik's Case
- Xorua
- How to Breakdance
- Blue
- Magic Plagueis the Wise
- jdata 解けなかった
- Class Project 解けなかった
- Kernel Infernal 1
CTFtime.org / UMDCTF 2022
久々に出たので、備忘録レベルで残しておく。
Renzik's Case
USBの論理イメージが与えられるので、削除された重要なデータを探す問題。
自分はAutopsyを利用して論理イメージを読み込んで、削除されたデータを探索した。
Xorua
ちょっとした思考パズルを要求される。
Before.png, After.pngというファイルが与えられるのでバイナリエディタで開いて観察してみよう。
以下のことより、Before.pngに対してフラグファイルをxorするとAfter.pngになると予想した。
- 同じファイルサイズである
- After.pngの先頭が不自然に0x00になっている
- 問題名がXorua
「Before.png xor flag = After.png」であるが、XORの性質を利用すると「flag = Before.png xor After.png」であるので、xor結合するpythonコードを適当に書いて実行。
import struct b1 = open('Before.png', 'rb').read() b2 = open('After.png', 'rb').read() b3 = b'' for i in range(len(b1)): b3 += struct.pack("B", b1[i] ^ b2[i]) f = open('flag.png', 'wb') f.write(b3)
運よく予想が当たり、フラグが得られる。
How to Breakdance
USB通信が入ったpcapファイルが与えられる。
通信からキータイプを抜き出す問題だろう。以下のページを参考に抜き出す。
Decoding Mixed Case USB Keystrokes from PCAP
wiresharkのクエリ的には((usb.transfer_type == 0x01) && (frame.len == 72)) && !(usb.capdata == 00:00:00:00:00:00:00:00)
で検索して、Leftover Capture Dataを持ってきて、上のページにあるスクリプトに食わせてやればいい。
Blue
ステガノグラフィー解析の問題。画像に情報を埋め込むためのコードと、埋め込まれた後の画像が与えられる。
画像の高さは775であり、こんなに文字長が大きくないだろうので、埋め込まれた後の画像の後半は元々の色になっているはずである。
なので、画像の一番下のピクセルからもともとの色、RGB値を読み込んで、解析に利用する。
埋め込みコードでは、ランダムなx座標とRGBのいずれかに+1をしながら文字を埋め込んでいるので、基準のRGB値からの差をすべてのx座標から計算して総和を取ることで復元する。
これより、以下のコードで復元可能。
from PIL import Image orig_image = Image.open('bluer.png') pixels = orig_image.load() width, height = orig_image.size orig_pixel = list(orig_image.getpixel((0, height - 1))) ans = '' for y in range(height): cnt = 0 for x in range(height): pixel = list(orig_image.getpixel((x, y))) for c in range(3): cnt += pixel[c] - orig_pixel[c] if cnt == 0: break ans += chr(cnt) print(ans)
Magic Plagueis the Wise
見ると先頭1ビットだけ違っていて、他は全部一緒のファイル群。
先頭だけ抜き出して眺めてみると、Asciiっぽいので、文字起こしするとフラグが書いてあった。
import glob files = glob.glob("./magic_plagueis_the_wise/*") l = len(files) tops = list(range(l)) for file in files: name = int(file.split('\\')[-1]) print(name) with open(file, 'rb') as f: tops[name - 1] = f.read()[0] ans = '' for c in tops: ans += chr(c) print(ans)
jdata 解けなかった
zipファイルが与えられる。解凍するとpngファイルがあり、フラグの末尾が書いてあるが、前半部分が見つからない。
んー、分からない。
0x52C50付近に怪しいものがあったが、繋がらないな…
UMDCTF(writeup) - HHJ :: Import HHJ
解説を見ると、zipはelfファイルらしい。
解凍時にエラー出てたけど無視してたな…いかん。
elfファイルをデコンパイルして中身を見てみるとフラグの前半が書いてある。
Class Project 解けなかった
起動しなくなったVMイメージが与えられるのでトラブルシューティングしよう。
適当にlinuxイメージをUSBで接続して中身を見ていくと、/home/aman_esc/Documents/fork_bomb.bash
というのがある。
見慣れぬコマンドだったが、調べてみるとFork爆弾というもので、DoSの一種らしい。
linux - What this command :(){ :|: & };: does? - Super User
これが原因で起動しないのか。削除すると起動するようになる。
んー、その後が分からんな…
CTF-Writeups/UMDCTF_2022/Class Project at main · K1nd4SUS/CTF-Writeups · GitHub
/home/aman_esc/Documents/admin_notes
にbase64デコードされたフラグが書いてあったららしい。
このファイル見つけたのにデコードしなかったな。なんでかな。
Kernel Infernal 1
カーネルのクラッシュログが与えられる。
第674回 カーネルのクラッシュ情報を解析する:Ubuntu Weekly Recipe|gihyo.jp … 技術評論社
この辺を参考にしながら、crashコマンドで中身を見てみる。
適当にいろんなサイトを巡回しながらやってると、filesで怪しいものが出てくる。
crash> files PID: 5206 TASK: ffff9b1878e45d00 CPU: 1 COMMAND: "bash" ROOT: / CWD: /home/ubuntu/XXXXXXXXXXXXXXXXXXXXXX1SCEhfQ== FD FILE DENTRY INODE TYPE PATH 0 ffff9b1878f87500 ffff9b1852988180 ffff9b18529a2720 CHR /dev/pts/1 1 ffff9b1878f99a00 ffff9b187c093540 ffff9b187c1cfad8 REG /proc/sysrq-trigger 2 ffff9b1878f87500 ffff9b1852988180 ffff9b18529a2720 CHR /dev/pts/1 10 ffff9b1878f87500 ffff9b1852988180 ffff9b18529a2720 CHR /dev/pts/1 255 ffff9b1878f87500 ffff9b1852988180 ffff9b18529a2720 CHR /dev/pts/1
CWDに書いてあるパスに含まれる文字列をbase64デコードするとフラグが得られる。