はまやんはまやんはまやん

hamayanhamayan's blog

UMDCTF 2022 Forensicまとめ

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_notesbase64デコードされたフラグが書いてあったららしい。
このファイル見つけたのにデコードしなかったな。なんでかな。

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デコードするとフラグが得られる。