Plaid CTF 2015 Write-Up
この前やっていたPlaidCTFで解いた問題のWriteUpです。
解けたもの
・Unknown (Forensics 30pts)
・Sawed (Misc 20pts)
簡単なものばかりですが・・・。
Unknown (Forensics 30pts)
不明なテキストデータが渡されます。
\begindata{raster,1}
という特徴的な書き出しや、bitsという単語で検索をすると、
「Andrew Toolkit raster object」なるものだと分かりました。
あとはNetpbmに含まれるatktopbmでビットマップイメージに変換して終了。
Sawed (Misc 20pts)
以下の長い文字列を解読しろという問題。
ddddddwwwwwwaaaaaasssssssssssssseddddddddddddddddddewwawwawwawwawwawwawwaedddssssssddddssssssssewwdwwdwwdwwdwwddssdssdssdssdsswwdwwdwwdwwdwwdwwdwwdassassassassassassassedddddddddddddddewwwwwwwwwwwwwwdssdssdssdssdssdssdsswwwwwwwwwwwwwwssssssssssssssedddddddddddewwwwwwwwwwwwweddddddddddessssssssssssssedddddddewwwwwwwwwwwwwweaaaaaaaedssdssdssdssdssdssdssewdwdwdddwddwdwwddwddwddwddewawwawawaaasasassasssasssdsssdsddsddddwdwwdwwwaaaessdddsddsddddsddddewdwdwdwdwdwdwdwawawawawawawaedddddddddddddddeddddddddaaaaaaaasssssssssssssswwwwwwwwdddddeddddddddeddddddwwwwwwaaaaaassssssssssssssedddddddddddddwwesdsddsdddwddwdwwwawwawawaawaawawwdwwdwdddsddsdsedddwwwdddesssssssssesssssess
ほとんどを占めるd、w、a、sの4キーから、これは上下左右の移動だろうなと直感で分かりました。
となると、その軌跡に意味があり、eは線の切れ目であると仮定し、以下のコードを書きました。
Processingです。
void setup(){ size(500, 500); String str = "ddddddwwwwwwaaaaaasssssssssssssseddddddddddddddddddewwawwawwawwawwawwawwaedddssssssddddssssssssewwdwwdwwdwwdwwddssdssdssdssdsswwdwwdwwdwwdwwdwwdwwdassassassassassassassedddddddddddddddewwwwwwwwwwwwwwdssdssdssdssdssdssdsswwwwwwwwwwwwwwssssssssssssssedddddddddddewwwwwwwwwwwwweddddddddddessssssssssssssedddddddewwwwwwwwwwwwwweaaaaaaaedssdssdssdssdssdssdssewdwdwdddwddwdwwddwddwddwddewawwawawaaasasassasssasssdsssdsddsddddwdwwdwwwaaaessdddsddsddddsddddewdwdwdwdwdwdwdwawawawawawawaedddddddddddddddeddddddddaaaaaaaasssssssssssssswwwwwwwwdddddeddddddddeddddddwwwwwwaaaaaassssssssssssssedddddddddddddwwesdsddsdddwddwdwwwawwawawaawaawawwdwwdwdddsddsdsedddwwwdddesssssssssesssssess"; PImage img = createImage(500, 500, RGB); boolean drawing = true; int x = 250; int y = 250; for(int i = 0; i < str.length(); ++i){ switch(str.charAt(i)){ case 'w': --y; break; case 's': ++y; break; case 'a': --x; break; case 'd': ++x; break; case 'e': drawing = !drawing; break; } if(drawing){ img.set(x, y, color(255)); } } image(img, 0, 0); }
そして得られた画像(一部)。