satto1237’s diary

s4tt01237’s diary

ラーメンとかCTFとかセキュリティとか

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.

f:id:satto1237:20190120232312p:plain

ライツアウトは、5×5の形に並んだライトをある法則にしたがってすべて消灯 (lights out) させることを目的としたパズル。(Wiki)

アプローチ:デコンパイル

ライツアウトのソルバ自体はググればたくさん出てきます.
ただ,今回のライツアウトは20×20なので愚直にやると解けなそうです.
なので正攻法?(デコンパイル)で解きました.

LightsOut.exednSpyデコンパイルすると以下のようなコードを発見できます. 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!

f:id:satto1237:20190121002230p:plain f:id:satto1237:20190121002256p:plain

アプローチ:javascriptの書き換え

問題文から一定以上のスコアを獲得すればflagが表示されることを読み取ることができます.

チートを行うためにChromeデベロッパーツールを使用してjsコードを確認すると以下のようになっています.

f:id:satto1237:20190121003156p:plain

かなり読みにくいですがscoreという変数名を手がかりにスコアの書き換えに利用できそうな処理を探していきます.
scoreで検索をかけると以下のようなコードを発見できます.

_d3(8,8,("SCORE: "+_G3(_e3._r3)));

このコードは恐らく左上のスコアを表示している部分の処理を行っているので_e3._r3に関する処理を書き換えればスコアに影響を与えることができそうだということが分かります.

_e3._r3で検索をかけると以下のようなコードを発見できます.

if((_e3._r3>=1000)){~~~~~}

このコードからスコアが1000以上になった場合に何かしらの処理が行われることが読み取れます.
そのため,コードを以下のように書き換えて再度ゲームをプレイしてみます.

if((_e3._r3>=1)){~~~~~}

f:id:satto1237:20190121005404p:plain

このようにflagが表示されました.

KOSENCTF{bASIc_buT_STrOng_AnTI_chEAT}

まとめ

  • Web, Cryptoが思うように解けずつらくなった…
  • 精進しなければ…
  • チームでCTFやるの楽しい!
  • Rev,Pwn投げっぱなしだったのでなんとかしたい…

チームメンバのWrite-up

szarny.hatenablog.com