UECTF2022 writeup
はじめに
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なのでO
は0
で正解。
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です。
Comments