サムネイル

こんにちは。ゆーろんです。 記録がてら、今回もCTFの備忘録をぼちぼち書いていきます。

ぼちぼち解くことを目指すので複数日またぐこともあると思いますが、よろしくお願いします。

問題

国内では有名な ksnctf です。 今回の問題は以下です。

#include   	 	<stdio.h>

     	#include  	  <string.h>

  int   	  	main
	()
   {   	const		char 	*
s	=
 "     	    "
"0123456789"
"     "

"		   "
"			         							  				 			 "
	 "ABCDEFGHIJ" 	;
	 printf	(
   	  "%c"	,		strlen
(s)
 );  int  i	  =	020000000	+	001000000	+
000600000
  +000040000
+000007000
+000000500
+000000020
+000000002  	;
   	  	printf		(
	"%s"
     	,&amp;  	 i
	)
;
	long
    long
			   							  				 		 	 					 l
	  =

  2LL
	    *
 	11LL

	  	 *
 	229LL

	    *
 	614741LL

	    *
 	9576751LL

	  	 +
 	5LL


 	;


 	printf
     	  	  (
	  "%s"

     	    ,


    &amp;


     		l


    )


     		 		;


    float


     	f		 =


     1.0962664770776731080774868826855754386638240000e-38f


     ;


     printf(		"%s"


     	 ,
	    &amp;f
 )
    ;
	double

d     		 			=
	6.7386412564254706622868098890859398199406890000e-308
 ;
  printf
("%s"
,&amp;d);
}

C++のソースコードが与えられています。 なぞにTabや空白があるので気味の悪いコードとなっています。

 

解いてみる

とりあえずC++なのでオンラインコンパイラを使用します。 実行結果は以下の通り

画像1

実行環境にはVSではなくideone.comというオンラインコンバータを使用。 結果から**l「標準入力が空」、「FROG_This_is_wrong_:(」**と表示の2つの情報を得られました。

標準入力が求められてないのにも関わらず、それが表示されたことにも疑問に持ちながらも解析のための情報をここで整理します。

  • 謎の空白とTab文字に関して調査
  • C++コードの解析

考えられる以上の2点に絞って調査します。

前者に関して調べるとWhiteSpaceなるスペースとTabで構成された難解プログラミング言語が存在することが判明。 ということで早速WhiteSpaceでコードを実行。

画像2

結果から「標準入力が空」、「PIN: 」と表示の2つの情報を得られました。 なにやら標準入力でPINを入力するようです。

コード解析のためにオンラインデバッカーを利用します。 アセンブリのようなものの中にPINコードっぽい、いくつか数字があります。

画像3

標準入力に入力してみるとFLAGが表示されました。

 

感想

c++に気がとられそうになりましたが、クリアできてよかったです。 今後はぼちぼちセキュリティ系も触っていきたいですね~。