ksnctf #7 Programming
ちょっと忙しくて記事書く時間がなかった。。。
今回はこちらの問題を解いてみたいと思います。
Problem
http://ksnctf.sweetduet.info/q/7/program.cpp
#include
#include
int main
()
{ const char *
s =
" "
"0123456789"
" "
" "
" "
"ABCDEFGHIJ" ;
printf (
"%c" , strlen
(s)
); int i = 020000000 + 001000000 +
000600000
+000040000
- 000007000
- 000000500
- 000000020
- 000000002 ;
printf (
"%s"
,& i
)
;
long
long
l
=
2LL
*
11LL
*
229LL
*
614741LL
*
9576751LL
+
5LL
;
printf
(
"%s"
,
&
l
)
;
float
f =
1.0962664770776731080774868826855754386638240000e-38f
;
printf( "%s"
,
&f
)
;
double
d =
6.7386412564254706622868098890859398199406890000e-308
;
printf
("%s"
,&d);
}
リンク先に飛ぶと、C++のようなソースファイルが。でもものすごく汚い。
Analyze
とりあえずコンパイルして実行してみる。
$ g++ q7.cpp $ ./a.out FROG_This_is_wrong_:( $
まぁうまくいくわけがない。
ソースコードにちらほら空白が入ってるのが気になって調べてみると、Whitespaceなるものを見つけた。(参考:Whitespace - Wikipedia)
どうやら空白を用いてプログラミングを行うものらしい。
Answer
ぐぐってると、Jacascriptに変換してくれるツールを見つけたので変換してみると以下のコードが得られた。
(function (stack, heap, callStack, main, buf) { (main = function (label, end) { do switch(label) { case 0: stack.push(80); WS2JS.putc(stack.pop()); stack.push(73); WS2JS.putc(stack.pop()); stack.push(78); WS2JS.putc(stack.pop()); stack.push(58); WS2JS.putc(stack.pop()); stack.push(32); WS2JS.putc(stack.pop()); stack.push(0); WS2JS.getn(function (n) { heap[stack.pop()] = n; main(14);}); label = 2; break; case 14: stack.push(0); stack.push(heap[stack.pop()]); stack.push(33355524); stack.push(-stack.pop() + stack.pop()); if (!stack.pop()) { label = '1'; break;} stack.push(78); WS2JS.putc(stack.pop()); stack.push(79); WS2JS.putc(stack.pop()); label = 1; break; case '1': stack.push(79); WS2JS.putc(stack.pop()); stack.push(75); WS2JS.putc(stack.pop()); stack.push(10); WS2JS.putc(stack.pop()); stack.push(0); stack.push(heap[stack.pop()]); stack.push(33355454); stack.push(-stack.pop() + stack.pop()); stack.push(stack[stack.length - 1]); WS2JS.putc(stack.pop()); stack.push(6); stack.push(stack.pop() + stack.pop()); stack.push(stack[stack.length - 1]); WS2JS.putc(stack.pop()); stack.push(11); stack.push(-stack.pop() + stack.pop()); stack.push(stack[stack.length - 1]); WS2JS.putc(stack.pop()); stack.push(6); stack.push(stack.pop() + stack.pop()); stack.push(stack[stack.length - 1]); WS2JS.putc(stack.pop()); stack.push(24); stack.push(stack.pop() + stack.pop()); stack.push(stack[stack.length - 1]); WS2JS.putc(stack.pop()); stack.push(26); stack.push(-stack.pop() + stack.pop()); stack.push(stack[stack.length - 1]); WS2JS.putc(stack.pop()); stack.push(40); stack.push(stack.pop() + stack.pop()); stack.push(stack[stack.length - 1]); WS2JS.putc(stack.pop()); stack.push(25); stack.push(-stack.pop() + stack.pop()); stack.push(stack[stack.length - 1]); WS2JS.putc(stack.pop()); stack.push(36); stack.push(stack.pop() + stack.pop()); stack.push(stack[stack.length - 1]); WS2JS.putc(stack.pop()); stack.push(66); stack.push(-stack.pop() + stack.pop()); stack.push(stack[stack.length - 1]); WS2JS.putc(stack.pop()); stack.push(16); stack.push(stack.pop() + stack.pop()); stack.push(stack[stack.length - 1]); WS2JS.putc(stack.pop()); stack.push(14); stack.push(stack.pop() + stack.pop()); stack.push(stack[stack.length - 1]); WS2JS.putc(stack.pop()); stack.push(14); stack.push(stack.pop() + stack.pop()); stack.push(stack[stack.length - 1]); WS2JS.putc(stack.pop()); stack.push(27); stack.push(-stack.pop() + stack.pop()); stack.push(stack[stack.length - 1]); WS2JS.putc(stack.pop()); stack.push(5); stack.push(stack.pop() + stack.pop()); stack.push(stack[stack.length - 1]); WS2JS.putc(stack.pop()); stack.push(29); stack.push(stack.pop() + stack.pop()); stack.push(stack[stack.length - 1]); WS2JS.putc(stack.pop()); stack.push(4); stack.push(-stack.pop() + stack.pop()); stack.push(stack[stack.length - 1]); WS2JS.putc(stack.pop()); stack.push(4); stack.push(stack.pop() + stack.pop()); stack.push(stack[stack.length - 1]); WS2JS.putc(stack.pop()); stack.push(28); stack.push(-stack.pop() + stack.pop()); stack.push(stack[stack.length - 1]); WS2JS.putc(stack.pop()); stack.push(22); stack.push(stack.pop() + stack.pop()); stack.push(stack[stack.length - 1]); WS2JS.putc(stack.pop()); stack.push(34); stack.push(-stack.pop() + stack.pop()); stack.push(stack[stack.length - 1]); WS2JS.putc(stack.pop()); stack.push(55); stack.push(-stack.pop() + stack.pop()); stack.push(stack[stack.length - 1]); WS2JS.putc(stack.pop()); label = 1; break; case 1: WS2JS.onExit(); case 2: end = 1; break; default: throw new Error('Invalid label :' + label);} while (!end);})(0); })([], {}, []);
jsに書かれている通りにPINコードを入力してやるとFLAGゲット。
感想とか
これも知ってるか知らないかでかかる時間がだいぶ変わってくると思います。
まぁでも総じていえることは ぐぐるって大事 ってことかな。