InterKosenCTF 2019 Write-up
はじめに
01/18~01/20に開催されたInterKosenCTFにチームNekochanNano!で参加しました.
NekochanNano!は1250pts獲得して12位(71チーム中)でした.
今回は自分が解いた2問(350pts)のWrite-upです.
[Cheat 100pts] lights out
Turn all the lights on.
ライツアウトは、5×5の形に並んだライトをある法則にしたがってすべて消灯 (lights out) させることを目的としたパズル。(Wiki)
アプローチ:デコンパイル
ライツアウトのソルバ自体はググればたくさん出てきます.
ただ,今回のライツアウトは20×20なので愚直にやると解けなそうです.
なので正攻法?(デコンパイル)で解きました.
LightsOut.exe
をdnSpy
でデコンパイルすると以下のようなコードを発見できます.
github.com
// Token: 0x06000017 RID: 23 RVA: 0x0000246C File Offset: 0x0000066C // Note: this type is marked as 'beforefieldinit'. static 745BBE96-A34C-4723-B7D4-089F48D57F2E() { 745BBE96-A34C-4723-B7D4-089F48D57F2E.<<EMPTY_NAME>> = new byte[] { 200, 223, 198, 210, 158, 149, 232, 159, 223, 216, 145, 155, 226, 149, 217, 238, 245, 232, 253, 247, 253, 235, 250, 198, 193, 199, 132, 197, 223, 212, 128, 217, 230, 242, 215, 237, 189, 224, 238, 235, 247, 240, 227, 181, 242, 180, 219, 202, 200, 196, 252, 224, 240, 171, 241, 244, 241, 167, 252, 253, 239, 200, 247, 253, 217, 223, 156, 148, 173, 128, 130, 138, 144, 130, 148, 148, 138, 134, 144, 140, 149, 149, 139, 216, 179, 158, 149, 147, 180, 156, 130, 156, 186, 158, 147, 157, 190, 184, 232, 134, 187, 187 }; for (int i = 0; i < 745BBE96-A34C-4723-B7D4-089F48D57F2E.<<EMPTY_NAME>>.Length; i++) { 745BBE96-A34C-4723-B7D4-089F48D57F2E.<<EMPTY_NAME>>[i] = (byte)((int)745BBE96-A34C-4723-B7D4-089F48D57F2E.<<EMPTY_NAME>>[i] ^ i ^ 170); } }
排他的論理和を使って怪しい処理をしてますね.
同様の処理を行った結果をデコードするとflag
が得られます.
#!/usr/bin/env python3 # -*- coding: utf-8 -*- if __name__ == '__main__': messages = [200,223,198,210,158,149,232,159,223,216,145,155,226,149,217,238,245,232,253,247,253,235,250,198,193,199,132,197,223,212,128,217,230,242,215,237,189,224,238,235,247,240,227,181,242,180,219,202,200,196,252,224,240,171,241,244,241,167,252,253,239,200,247,253,217,223,156,148,173,128,130,138,144,130,148,148,138,134,144,140,149,149,139,216,179,158,149,147,180,156,130,156,186,158,147,157,190,184,232,134,187,187] flag = [] for i, message in enumerate(messages): flag.append(message ^ i ^ 170) print(bytes(flag))
> python solve.py b'btn{0:D2}{1:D2}KOSENCTF{st4tic4lly_d3obfusc4t3_OR_dyn4mic4lly_ch34t}Congratulations!MainFormLights Out'
KOSENCTF{st4tic4lly_d3obfusc4t3_OR_dyn4mic4lly_ch34t}
[Cheat 250pts] anti cheat
Get a super good score!
アプローチ:javascriptの書き換え
問題文から一定以上のスコアを獲得すればflag
が表示されることを読み取ることができます.
チートを行うためにChromeのデベロッパーツールを使用してjsコードを確認すると以下のようになっています.
かなり読みにくいですがscore
という変数名を手がかりにスコアの書き換えに利用できそうな処理を探していきます.
score
で検索をかけると以下のようなコードを発見できます.
_d3(8,8,("SCORE: "+_G3(_e3._r3)));
このコードは恐らく左上のスコアを表示している部分の処理を行っているので_e3._r3
に関する処理を書き換えればスコアに影響を与えることができそうだということが分かります.
_e3._r3
で検索をかけると以下のようなコードを発見できます.
if((_e3._r3>=1000)){~~~~~}
このコードからスコアが1000以上になった場合に何かしらの処理が行われることが読み取れます.
そのため,コードを以下のように書き換えて再度ゲームをプレイしてみます.
if((_e3._r3>=1)){~~~~~}
このようにflag
が表示されました.
KOSENCTF{bASIc_buT_STrOng_AnTI_chEAT}
まとめ
- Web, Cryptoが思うように解けずつらくなった…
- 精進しなければ…
- チームでCTFやるの楽しい!
- Rev,Pwn投げっぱなしだったのでなんとかしたい…