はじめに
9/1,2と佐世保高専主催の高専セキュリティコンテストにオンラインで参加しました。
SECCONには過去何度か参加経験ありますがその度に全く知識が身についていないので備忘録も兼ねてWriteUpです。
結果
最終成績が16/35で総合得点は1200点です。クッソ微妙です。
そのうちの自分が解いたやつ+終わってから理解したやつを書いていきます。
02 ログインしたい!
何も考えずにとりあえずIDAにぶち込んだらIDAが標準でASCIIコードを文字に起こしてくれるもんだから一瞬でFLAGが分かりました
06 exchangeable if

こんな感じの画像が渡されました。なんで中央じゃなくて微妙に右下に寄ってるのか気になりましたが全く関係なかったです。
この画像、画像タイトルmd5=2009d1c114ed83f57cf8adde69fd6ca8となっているので、最初画像のハッシュ値かと思い調べましたが違いました。ファイル破損も疑ったので何度か確認しましたが画像のハッシュ値ではないことが分かりました。
じゃあSCKOSEN{~xxxx~}のハッシュ値か?と思いコーディングタイムです。
# include <stdio.h>
# include <string.h>
# include <openssl/md5.h>
int compute_md5(unsigned char * src, unsigned int src_len, unsigned char * buffer) {
	MD5_CTX c;
	MD5_Init(&c);
	MD5_Update(&c, src, src_len);
	MD5_Final(buffer, &c);
	return 0;
}
int main(){
	char str[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
	int length = strlen(str);
	char pass[] = "SCKOSEN{sHDtF1xxxxNLTIWp}";
	char answer[] = "2009d1c114ed83f57cf8adde69fd6ca8";
	unsigned char md[MD5_DIGEST_LENGTH];
	char mdstr[33];
	int i,j,k,l,m;
	for(i=0; i<length;i++){
		for(j=0; j<length;j++){
			for(k=0; k<length;k++){
				for(l=0; l<length;l++){
					pass[14] = str[i];
					pass[15] = str[j];
					pass[16] = str[k];
					pass[17] = str[l];
					compute_md5(pass, 25, md);
					for(m=0; m<16; m++){
						sprintf(&mdstr[m*2], "%02x", (unsigned int)md[m]);
					}
					//printf("%s\n",pass);
					//printf("%s\n",mdstr);
					if(strcmp(mdstr, answer) == 0){
						printf("%s\n",mdstr);
						printf("%s\n",pass);
						return 0;
					}
				}
			}
		}
	}
	return 0;
}
結果はSCKOSEN{sHDtF1qOLZNLTIWp}でした。OpenSSLの導入に手間取った
14 アカウントを奪え

SQLインジェクションの知識はありましたがブラインドSQLインジェクションの知識は無かったためかなり手間取りました。かなり頭の悪い手法を取りました。
普通はSUBSTR句を使うようですがLIKE句を使用しました。
- まずは kosenjoh' AND pass LIKE '%a%' -- とa~zまでの文字の中でどの文字が使われているか確認
- 次に kosenjoh' AND pass LINE '_' -- とアンダーバーの数を増やしていきパスワードの総文字数の確認
- 総当たり
1~3の流れを人力で行いました。盛大に笑ってください。大体30~40分くらいかかりました。
SCKOSENが終わった後に他の方のWriteUpでブラインドSQLインジェクションの存在を知って一人勉強会開催したので次は多分大丈夫だと思いたい。
22 ディスクが足りない!
file file
をしてファイル形式特定して何度も解凍を繰り返して取得しました。
21 謎のファイル
これはSCKOSEN終了後に調べて分かりました。
まず手に入るfileはzip形式なのでrenameして解凍したらrename_me.xmlとかwordフォルダとかが出てきて、まずrename_me.xmlを読むと
<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
とあったのでこのURLをgoogleさんに投げるとOpenXMLと返ってきました。なんじゃいそりゃとさらに調べると、WordやExcelファイルは拡張子を.Zipにして解凍するとxml形式でソースが読めるとのこと。
.docxを解凍すると今回のようなファイルツリーになるようなので、rename_me.xmlファイルくんを恐らく本来の名前であろう[Content_Types].xmlに変えて、またファイルをzip圧縮してから拡張子を.docxに変えると見事wordで開けました

これがフラグですね
感想
今まで参加したSECCONは何から何までさっぱりで解けてもせいぜい1問とかだったのですが、今回は4問も解けたので一番楽しかったですね。これを機にksnctfとかの恒常ctfを解いてもっと勉強しようと思います。
あとBash on Windowsはダメですね、32bit実行ファイルが軒並み実行できずにかなり苦戦しました。最終的に諦めましたが。