アオカケスの鳥かご

日々の出来事を綴っていきたい

MaidakeCTF2019 writeup Programming編

Programmingのwriteupです。

Only reserved words[150]

予約語だけ。

パールの予約語だけで構成されているプログラムです。

#!/usr/bin/perl -w
oct oct hex ord q pop and print chr ord uc q rmdir and print chr ord q each ne and print chr ord q sin s and print chr ord qw q die q and print chr ord q each le and print chr ord q mkdir m and print chr ord q ne sin and print chr ord uc q lc eval and print chr ord uc q gt log and print chr ord uc qw q for q and print chr length q q write getc exp split uc closedir while msgctl lcfirst delete fileno chop while sysread send rmdir or dump accept last sin q and print chr ord q split s and print chr ord q open do and print chr ord q ref or and print chr ord qw q not q and print chr ord q lc eval and print chr ord q local and print chr ord qw q die q and print chr ord q ge log and print chr oct hex ord uc q my m and print chr ord q lc eval and print chr ord q xor x and print chr ord qw q not q and print chr ord q msgctl m and print chr ord q tie gt and print chr ord qw q sin q and print chr ord q gt log and print chr ord qw q s q and print chr oct hex ord uc qw q y q and print chr ord q xor x and print chr ord qw q not q and print chr ord qw q lc q and print chr ord q my alarm and print chr oct hex ord uc qw q y q and print chr ord q local and print chr ord qw q fcntl q and print chr oct hex ord uc qw q y q and print chr ord q open no and print chr ord q ne sin and print chr ord q qr eq and print chr ord qw q le q and print chr oct hex ord uc q my m and print chr ord q or no and print chr ord q ref or and print chr ord q msgctl m and print chr ord q ne sin and print chr ord q or no and print chr ord q eval ne and print chr ord q ge log and print chr ord qw q dump q and print chr oct hex ord uc q my m and print chr ord q qw eq and print chr ord q local and print chr ord q or no and print chr ord qw q do q and print chr ord qw q sin q and print chr oct oct hex ord q ge log 

実際に実行してみます。
f:id:aokakes:20190926152309p:plain

エラーを吐いていますがFlagが出力されました。


Flag:MaidakeCTF{ppencode_consists_only_of_perl_reserved_words}

Calculator[200]

計算機。

まずは問題文にあるアドレスにアクセスしてみます。
f:id:aokakes:20190926152514p:plain

50問解いたらFlagが貰えます。

暗算でも解ける単純な問題ばかりなので、もしかしたらプログラムを用意するよりも暗算のほうが早いかもしれません。1問でも間違えたら最初からですけど。

いくつか解いてみると、足し算か引き算だけなのでプログラムはかなり単純になります。


Flag:MaidakeCTF{It_is_also_possible_to_calculate_it_by_yourself}

Not ending[200]

終わらない。

フィボナッチ数列を計算するプログラムです。

import sys

sys.setrecursionlimit(100000)
def fib(n):
	if n <= 1:
		return n
	return fib(n-1) + fib(n-2)

in_flag = str(fib(8192))[:40]
print ("MaidakeCTF{"+in_flag+"}")

このままだと再帰しすぎて全然処理が終わりません。
そんなときはとりあえずメモ化します。

pythonは「@lru_cache(maxsize=None)」を付け加えるだけでもいけます。

import sys

sys.setrecursionlimit(100000)
def fib(n):
	if n <= 1:
		return n
	return fib(n-1) + fib(n-2)

in_flag = str(fib(8192))[:40]
print ("MaidakeCTF{"+in_flag+"}")

実行すると一瞬で終わります。
f:id:aokakes:20190926153413p:plain


Flag:MaidakeCTF{4756241803154148324967643192669456886214}

Not output[200]

出力されてない。

タイトルとコピーライト以外なにも表示されていません。
f:id:aokakes:20190926153445p:plain

ソースを確認してみると、最後のほうでjavascriptでFlagをflagという変数に読み込んでいます。

<script type="text/javascript">
	$.post('flag.php').done(function(data) {
		flag = data;
	});
</script>

しかしこのflagという変数はどこかに出力するようにはなっていません。

console.logなどでflagの中身を出力しましょう。
f:id:aokakes:20190926153729p:plain


Flag:MaidakeCTF{We_can_output_javascript_variables_with_the_developer_tool_even_if_it_is_not_output_to_the_browser}

Calculator 2nd[300]

2個目の計算機です。

1個目の計算機よりもかなり面倒くさくなっています。
f:id:aokakes:20190926153919p:plain

桁数が無駄に増えている上に掛け算と割り算もあるので大人しくプログラムを書きましょう。

実行すると、少し時間がかかります。
なにせ500問解かなければいけませんから。

f:id:aokakes:20190926154211p:plain


Flag:MaidakeCTF{The_machine_gives_accurate_answers_even_if_the_calculation_is_complicated}

まとめ

プログラミングの問題は解きやすいものが多かったのではないでしょうか。
本当はもう少し問題を用意したかったのですが、サーバーのスペック的な問題もあってこんな感じになりました。