はじめに

11/18 20:00 ~ 11/20 20:00の期間で開催された初心者向けCTF

久々にソロで出るCTFだった。

別コンテストの隙間時間にやる感じだったが、息抜きになったし、普段やらないような分野にも手を出せて楽しかった。

Crypto

RSA

RSA暗号でフラグを暗号化してみました!解読してみてください。

cipher text: 40407051770242960331089168574985439308267920244282326945397
p: 1023912815644413192823405424909
q: 996359224633488278278270361951
e: 65537

普段Cryptoには一切手をつけていないので、何もわからずRsaCtfToolで殴った

$ ./RsaCtfTool.py -e 65537 -q 996359224633488278278270361951 -p 1023912815644413192823405424909 --uncipher 40407051770242960331089168574985439308267920244282326945397
private argument is not set, the private key will not be displayed, even if recovered.

Results for /tmp/tmpqfskkxcu:

Unciphered data :
HEX : 0x55454354467b5253412d69532d566552792d35314d7031657d
INT (big endian) : 535251971441201547690579709091650584058216076608475543725437
INT (little endian) : 787118965001959771733939931024213066609133944657257179596117
utf-8 : UECTF{RSA-iS-VeRy-51Mp1e}
STR : b'UECTF{RSA-iS-VeRy-51Mp1e}'

Forensics

Compare

新しくUECTFのロゴを作ったよ。え?元々あったロゴと同じじゃないかって?君はまだまだ甘いなぁ。

bitmapが2つ渡されたのでdiffを取るとguessした。

xxd -iしてdiffを取ると、ASCIIでFlagが埋め込まれているので気合で抽出。

こういう時にシュッとスクリプトを書くのと、気合で読むの、どっちが早いのかを競技中に見極める能力がほしい。

Deleted

binwalkしたら画像Flagがあった。ここからが難しい。

全体的にleetが使われているので、Oじゃなく0だろうとguessしたら正解。

Discord 1

展開してfd -x file| rg image | awk '{print $1}' | sed 's/://' | xargs -I{} xdg-open {}

画像漁ってたら発見。今回もleetなのでO0で正解。

Discord 2

展開してrg --binary UECTFで普通に出てきた。

draftもlogに残ってるの面白い。

Web

webapi

普通にFLAG_URLって書いてあるので、curlするだけ

Misc

caesar

cyberchefと迷って手元で解いた。多分正解

from string import ascii_uppercase,ascii_lowercase,digits,punctuation

def encode(plain):
  cipher=''
  for i in plain:
    index=letter.index(i)
    cipher=cipher+letter[(index-14)%len(letter)]
  return cipher

ascii_all=''
for i in range(len(ascii_uppercase)):
  ascii_all=ascii_all+ascii_uppercase[i]+ascii_lowercase[i]
letter=ascii_all+digits+punctuation
plain_text='UECTF{SECRET}'
encoded = '2LJ0MF0o&*E&zEhEi&1EKpmm&J3s1Ej)(zlYG'
flag=encode(encoded)
print(flag)

redaction gone wrong 1

pdf2txt.py challenge.pdf | rg UECTF

redaction gone wrong 2

目が良いので気合で読んだが、頭が悪いのでroflって何??なんでleetじゃないの???調べてみました!!!!となった。

lolみたいな感じで、Rolling On the Floor Laughingの略らしいです。いかがでしたか?

gif1

imagemagick問題

convert UEC_Anime.gif +adjoin out%03d.png

085, 086辺りのサイズがおかしいので見るとまた画像でFlagがある。

gif2

stegsolve問題

ポチポチしてるとRed plane 0でFlagが出てきた。Gray bitsで見やすくなった。

Rev

A file

unar challして出てきたELFにstringsしたらFlag取れた

revPython

pycやんけ〜つってツール集めてデコンパイルしようとしたが、失敗する。

仕方なくdisas読んでたらsha256との一致求められて「え、無理やんけ?」ってなったが、バイナリ手元にあるの思い出してpatch当てて通した。

よく考えたらその後の処理読んだほうが早かったかもしれない。CTF向いてない。

captain-hook

問題名からLD_PRELOADでrandomあたりのhookすればいいのかな?とguess。惜しい、randでした。

次はhookを何で書くかが問題だが、流石にCTFなのでRustではなくCにした。

int count = 0;

int rand() {
    if (count == 0) {
        count++;
        return -1;
    } else {
        return -3;
    }
}

discrete

angrっぽい問題だったので、とりあえずangr動かしてから読んだ。

gdbを使うと、3byteずつ比較しているので愚直に出せる。gdbの方が早かった。

dotnet

愚直に読んでしまった。binwalkか〜…

Pwn

buffer_overflow

早解きしようとするも、問題サーバが動いておらず失敗。Pwnを諦める。

バイナリ配ってよくない?

普通に1いっぱい入れるだけで解けます。

guess

payload = b'\0'*32
io.sendafter(b'> ', payload)

sendlineafterじゃなくてsendafterにすればOK。

buffer_overflow_2

何回かROPすれば良いはずだが、libc無いしNX立ってるしめんどくさがって放置してしまった…

rot13

indexに負値入るな〜とか思ってたが、他の問題とメシに時間を取られ敗北。.NETダルすぎ

おわりに

PwnもRevも全完できなかったのでそこには文句言えないんですが、画像フラグやめてほしいしせめて短くするか読みやすいフォントにしてほしいという気持ちがあります。

全体的には楽しかったのでOKです。