UECTF2022 WriteUp
はじめに
電気通信大学のCTFサークル(@uec_ctf)主催の初心者向けCTFに参加したのでWriteUpを残します。
開催時間は11/18 20:00~11/20 20:00 の三日間で、最終日は用事があったので着手することができませんでした。
結果
順位は47/105位でした。
解けた問題
REV
A file
「chall」というELFファイルが渡されます。
とりあえずstringsコマンドを使ってフラグを探してみたら見つかりました。
MISC
redaction gone wrong 1
「challenge.pdf」というPDFファイルが渡されます。
フラグ部分が黒く塗りつぶされていますが、Adobe Acrobat で開いて黒塗り部分をどかします。
redaction gone wrong 2
「flag.png」というpngファイルが渡されます。
頑張って読みました。(これでよかったのだろうか...)
GIF1
「UEC_Anime.gif」というgifファイルが与えられます。
一瞬フラグが見えるので、画面を録画してなんとかしました(これでよかったのだろうか...2)
GIF2
「UECTF.gif」というgifファイルが与えられます。
これはGIF1とは違い、フラグが目視できません。
うさみみハリケーンのステガノグラフィー解析を使用します。
赤色 ビット0抽出を行うとフラグが発見できます。
FORENSICS
Deleted
「Image.raw」というrawファイルが与えられます。
最初はbinwalkを使ってカービングすればいけそうだと思っていましたが
いくつか開けないファイルがあり詰まっていました。
色々調べていると「Autopsy」というツールが便利だと知りとりあえず突っ込みました。
するとあっさりフラグが書かれたファイルが見つかりました。Autopsyすごい...。
CRYPTO
RSA
from Crypto.Util.number import getPrime, inverse, bytes_to_long, long_to_bytes, GCD def enc(p_text): N=p*q c_text=pow(p_text,e,N) #cipher_text=plain_text^e mod N print('cipher text:',c_text) print('p:',p) print('q:',q) print('e:',e) e = 65537 p = getPrime(100) q = getPrime(100) #e:public key #p,q: prime number plain=b'UECTF{SECRET}' plain=bytes_to_long(plain) #bytes_to_long:bytes -> number #long_to_bytes:number->bytes enc(plain)
拡張ユークリッドを使ってデコードします。
import binascii def extgcd(a, b): if b == 0: x = 1 y = 0 d = a return x, y, d y, x, d = extgcd(b, a % b) y -= a // b * x return x, y, d def main(): c = 40407051770242960331089168574985439308267920244282326945397 n = 1020184979087759355426525961857540965815429299915844381237459 e = 65537 p = 1023912815644413192823405424909 q = 996359224633488278278270361951 d, k, _ = extgcd(e, (p - 1) * (q - 1)) while d < 0: d += (p - 1) * (q - 1) m = pow(c, d, n) print(binascii.a2b_hex(hex(m)[2:])) main()
おわりに
時間のほとんどをステガノグラフィーに割いてしまい、pwnに全く手を付けることができませんでした。
また他のCTFに参加する機会があれば積極的にpwnに挑戦したいです。
古典暗号を解くことができなかったのも悔しい所です。
ですがCTF初心者なりに色々な問題に取り組むことができとても楽しかったです。
UECTFさんに感謝です!ありがとうございました!!