投稿者「みむら」のアーカイブ

サーバマシンを入れ替えました。

どうも、みむらです。

ある夜。
サーバに設定しておいたプログラムが書いたとおりに動作しなくなり、
直すか、と。

自動でアップデートするようには(当時)設定していませんでしたし、
おかしくなる前1ヶ月程度は、特にログインして設定変更をしたりもしていませんでしたので、

ある意味で

image

というような感じになっていました。

ニコニコ大百科の下記の記事を見てみますと、
何もしてないのに壊れたとは (ナニモシテナイナラコワレナイとは) [単語記事] – ニコニコ大百科

賢明な読者諸君にはお分かりの通り、基本的に何もしなければパソコンは壊れないのである。

ということだそうですが、壊れるよ!

 

下の方、色々と雑談が書いてありますが、
技術的な内容に関しては半分から下の方に書いてあります。

 


 

まず試すのは、再起動ですよね。でもこれが「決定打」でした。

reboot とコマンドを打つと、
I/O エラーの表示がぼこぼこ出ながらシャットダウンが進行し、
そのまま電源が切れました

あれ、コマンド間違えたかな・・と電源ボタンを押すのですが、電源は入らず。
CMOS クリアすればいいかな? とやってみるも入らず。

電源経路に問題が起きたかな・・とサーバマシンまでの電源経路を確認してみるも
正常に給電できている。

 

そんなわけで、電源かマザーボードか、その他パーツが壊れているのかな・・と思い
とりあえずマザーボード変えてみるか・・ということで買うことにしました。

 


 

そういえば・・

大阪はいいところですね。
ビールで人間、ここまで幸せになれるとは思いませんでした。

なんでこんなことを書いたのかと言えば、
CTF for ビギナーズ 大阪 が “CTF だけ” という内容で開催されたのですが、
あのときに丁度、マザーボードと一緒に大阪市内を行動していました。

 


 

というわけで帰宅後、
マザーボードが用意できまして
電源を繋いでみますとちゃんと電源が入って UEFI の画面が出てきまして、
「おっ、これでいける・・!」と。


そのときは環境を移行するにしても、別にやる事がありましたので
後回しにしよう・・と数日眠らせることに。

 

・・どうでもいいですが、やはり何かに集中しすぎて、
「気づかないストレス」が貯まっている時は恐ろしいものですね。

メモリは増やした方がいいんじゃね!」とか
「そういや、サーバを SSD にしたらうるさくなくていいかも!」と
ふらっと秋葉原の九十九さんにいって買ってきてしまいました。

 

 

店に行って何か買い物をすると、
一時的にストレスが吹っ飛ぶのもあって、こう、実にクレジットカードというものは恐ろしい

 

なんだかんだ今年を軽く振り返ると、結構根詰めると、
「目の前にある一番優先度の高いことを熟す」か「ストレス解消が出来るものをする」の
どちらかのみしかしなくなることが分かりました。

そんなわけで最近は、
最長でも半日ぐらいのクオンタムなプリエンプティブ・マルチタスクな感じ
割当て時間は短くても、一通り全部の平行している事に手を出そう・・と思いました。
LINE しかり、Twitter しかり、Facebook しかり。。

 

 


 

サーバ構成

さてさて。閑話休題。

そんなわけでサーバ構成はこんな感じになりました:

マザーボード ASRock N3050B-ITX  / 9千円ぐらい.
(Intel® Dual-Core Processor N3050)
メモリ CFD W3N1600Q-L4G / 6,782 円
ストレージ SanDisk SD8SBAT128G (@5,480円) * 2 = 10,960 円
ケース 流用.
OS Microsoft Hyper-V Server 2016 (!)

最初は Linux を直に走らせる予定だったのですが、
「Intel VT が乗っている・・? Hyper-V 上で動かしてみるか」とやってみたところ、
これが思ったよりも快適に動作してしまったのでこのまんま、という感じです。

 


 

動かしてみてどうよ

Hyper-V Server は RSAT を使って他の Windows マシンから管理します。
ネットワーク構成はこんな感じ(とっても端折ってます。

 

image

 

でもって、実際の Hyper-V マネージャの状態はこんな感じ。

 

image

 

そして、普段動かしている状態で、
サーバの CPU 使用状況はこんな感じになっています。

image

 

なんだかんだ、Linux 3台起動してごにょごにょやっていても、
CPU は普段省電力な状態になっていて、
熱をそこまで発生しないため ファンは普段止まっています。
SSD 構成なのもあってうるさく無いですし。

 

Facebook や Twitter に記事のリンクを貼り付けて、アクセスが一気にやってきたときも、
大体 0.8 Ghz あたりまでで全部捌ききってしまいますので、
このあたりはさすがだな・・と。

 

また Hyper-V 上に乗っているため、
何か大きな変更を加えようとしたときにはチェックポイントを設定できますし、
VLANを切ったり、通信をミラーさせたり、ソフトウェアベースで自由自在に出来るため、
色々と遊べるな・・とニヤニヤしています。

 

ただ、悪い点もありまして、
まず、Hyper-V マネージャで VM の画面を表示したときと、
スパム業者がコメントを連投してきた時に
CPU のクロックが 1 Ghz 程度にひょこっと上がることがありまして、
このあたりに関しては・・どうしようもないのかなと。

 


 

サーバの設定など。

 

ゲスト環境:

ゲストでは CentOS 7 x86_64 が動いています。
でもって、通信周りはいったん Router VM がすべて受け付けて、
その後 Web サービスと メールサービスに分かれて各 VM が受け付けるようになっています。

 

あとは SELinux を有効にする・・とか。

もしいい感じの設定が分からない場合は、
基本的にはデフォルトの設定を見て、自分の環境に合わせた変更をすればいいのかな、と思います。

たとえば、ウェブサーバのファイルであれば
“semanage fcontext –l | grep /var/www”
などを実行して雰囲気をみたり、

ポートであれば
“semanage port –l | grep http” として雰囲気をみたり。。

その他、設定方法については
SELinux で restorecon してあうあう – みむらの手記手帳
を見て頂ければと思います。

 

ウェブサーバは Apache で動いていますが、MPM は “event” で稼働しています。

・・なんとなく、 nginx は早いよ! という指摘に対して
“Apache はどこまでいけるん?” と気になったというのが理由で、
実際そこまで Apache に愛着はあんまりありませんが、
やってみたところ「早いな」と思ったのが印象です。

 

 

ホスト環境:

サーバに関しては、 Hyper-V Server 2016 のテクニカルプレビュー版を使っています。

「面白いな」と思うところとしては、
このように Linux が セキュアブート有効な状態で起動できる、というところでしょうか。

image

第一世代ですと、余計なエミュレーションが走るとのことで、
第二世代で稼働できるというところはいいな・・と思うのですが、
実際どうなのか・・というところは、全く検証できていませんので、「気持ちの上で」ということにさせてください。

 

それと、これはもしかすると前のバージョンの Hyper-V でも対応出来ていたのかもしれませんが、
ゲスト OS で /proc/cpuinfo を見ますと、flags に ”aes” が含まれていまして、
AES-NI が使えるのかな・・?とぼんやり期待しています。

その一方で “avx” が出てこないのは、なんだかなーとも思いますが。

 

 

それと、これは MS 的には非推奨だと思いますが、
C ドライブをミラー状態にしてあります。

image

あんまりおすすめしませんが、
次のように操作すれば作成できました:

1. Hyper-V Server を GPT 形式で通常通りインストールする。
2. Linux で起動してパーティション情報をコピーする。

コピー方法 (/dev/sda の情報を /dev/sdb にコピーする場合)

sgdisk -R /dev/sdb /dev/sda
sgdisk -G /dev/sda

やっている事としては、1行目でパーティション情報をまるっとコピーして、

2行目で GUID を再生成する・・という動作になります。

もしディスクが片方使えなくなってもシステムが起動できるようにする場合、

回復パーティションや efi ファイルが入っているパーティションを dd でコピーしておきます。

dd if=/dev/sda1 of=/dev/sdb1 bs=32M
dd if=/dev/sda2 of=/dev/sdb2 bs=32M
dd if=/dev/sda3 of=/dev/sdb3 bs=32M

 

3.  C ドライブ部分に該当するパーティション(一番最後にある大きいパーティション)を消す。
4.  Hyper-V Server を起動して、2つともダイナミックディスクに変換する

diskpart コマンドにて、次のコマンドを入力します:

select disk 0
convert dynamic
select disk 1
convert dynamic

5. C ドライブのパーティションをミラー設定にする。

diskpart コマンドにて、次のコマンドを入力します:

list volume
 -- ボリュームの一覧がここで出てきます --
select volume (C ドライブのボリューム番号)
add disk=1

 

今のところこれで問題なく動作はしているようですが、

サーバ構成がぶっ飛んだときにどこまで戻せるか、というのは今のところ不明です。

Microsoft としてもこの構成は推奨していないと思います。

( RAID-1 構成を普通に組もうとすると怒られるため。

 


 

まとめ

そんなこんなで、

ちゃんと動くのか、障害発生時はどこまで対応出来るのかというところは

色々と未知数なところはありますが、

現時点において省電力管理のしやすい自宅サーバができあがったかな・・と。

 

もし N3050B-ITX のパワーがどんなもんか知りたい、という人がいましたら

このような感じで「個人的なサーバ用途には十分使えますよ」と答えられるかと思います。

現にこのウェブサイト自体が、このサーバ上で動いている、ということもありますし。

 

ただ、大きめのデータベース処理であったり、

動的コンテンツがいっぱいあるウェブサービスを動かそうとしていたり、

録画サーバでエンコード機能も持たせたいという場合は色々と考える必要があるかと思います。

ですが、石自体は AVX2 も搭載されていますし、

Intel Quick Sync Video も乗っているようですので、

上手く使えば動画エンコードも回せるのかもしれません。

(たとえば、夜にアニメを録画して、そのほかの時間でエンコードをするとか。)

 

・・・というわけで、使い方によっては色々と遊べるマザーボードだと思います。

QR puzzle Write-up

どうもみむらです。

冬だ!おこただ!CTFだ! ということで、
今年も SECCON CTF 2015 のオンライン予選に参加しました。

12月5日~12月6日ということで、
んじゃ泊まり込んでやってみますか・・ということで、
大学に泊まり込んでやっていました。

・・・論文作成で煮詰まっていたので、気分転換にもいいよね! ということで。

 

今回は出題された問題のうち、 “QR-Puzzle (Windows)” という問題について。

問題概要や想定解に関しては、出題者である山崎さんの記事を閲覧して頂ければとおもいます。

SECCON 2015オンライン予選に3問を出題しました! | ラック公式ブログ | 株式会社ラック
http://www.lac.co.jp/blog/category/security/201512072.html

 

さて。
CTF, Windows と来ると勝手に「やる気スイッチ」(古い?)が入る私です。

問題に関してこんな感じで解きました:


1. ファイルを見る。

image

.net !!
ドットネットですよ、おくさん!!

これはもう、この時点で やる気スイッチ が入ります。
びんびんに入ります。

 

ということで、まずは逆アセンブリ結果を見ていきます。

image

まずリソースを見て、”SmartAssembly なのかなぁ..” と思いを馳せ、

次に作者の名前をみて「ごめんなさい..」という懺悔の気持ちになり、
いったん気分転換の為にお風呂に行きました。

このとき、銭湯にて、風呂場にいた皆さんからもの凄く強い視線を感じて
「何か私ミスしてるかな・・」と思って振り返ったところ、
皆さん背中や腕に絵が描かれていたのはいい思い出です。
でもそのあと「怖い人じゃない・・!」と思う出来ごともありまして、
ルシウス技師の言葉を思い出した・・ということがありました。

 

その後、いったん自分のなかで「ごめんなさい」をしたうえで、
「んじゃ解くか!」ということで解析を始めました。

いえ、以前こういう形で取り上げられたことがありまして・・
http://www.slideshare.net/ymzkei5/xss-201412089

また、いろいろとお世話になっているかたでもありますので、申し訳ない気持ちがあったのですが、「これは CTF だ。今は競技に集中して、終わった後、お会いした時に謝ればいい」と気持ちを切り替えました。

 


2. プログラムを起動する

image

QRCode のパズルゲームになっていました。
手でかちゃかちゃやって、何か文字が得られる QR であるということも分かりました。


3. 難読化を解く

プログラムがどういうものか分かったところで、難読化を解きます。
なんとなく雰囲気から SmartAssembly 感がしていましたので、
その難読化解除ツールをインターネット上から適当に持ってきて適用します。

 

難読化解除前:

image

難読化解除後:

image

 

読めるようになりました。


4. Form_Load を読む

普通の .net なアプリケーションを読む場合、読み始める場所は多々あるのですが、
画面の初期化部分のコードを見ることで、何を叩いているのかを調べることにしました。

こんな感じのコードです。
スタックベースの処理系なので、引数を積んで、呼び出して、結果は積まれる。というような。

image

 

でもって、注目したいのはこのあたり。

image

 

引数(数字)を取って、返値は文字列になる。
なんとなく答えの文字列を読んでそうな雰囲気がしましたので、ここを読んでみます。

読み込んでいると思われる所は他にも幾つかありましたが、
読むのが面倒くさそうだったのでやめました・・。

たとえば、答えをメモリ上で MD5Hash にしている・・と思われる箇所など、
幾つか良さそうな場所もありました。

image

見た感じ、リソースファイルから何か読み出しているんだろう、という雰囲気が伝わってきます。

確認のためにコンストラクタも見てみますと、
自分自身を取得してその中のリソースファイルを抜き出した後、
処理を実行している事が読めますので、この中に何か答えに繋がるものがあるな、と判断できます。

(実際にはリソースデータをデータとして抜き出した後、難読化を解除し、そのあとそのデータをライブラリとして読み直して、中に書かれている命令を実行するコードが書かれているようです。)

image


5.内部リソースを展開

いちいち手で解いてもいいのですが、CTF は時間勝負ということで、
「どうせ一回解いたデータはメモリ上に持ってるだろ・・」ということでデータを抜き出します。

デバッガでちまちまーっとやって ( “.loadby sos clr” とか・・! ) 抜き出すとこんな感じ:

image

なんかこう、英単語帳みたいな Dictionary 型のデータが出てきました。

 

もしかして・・と思い、最初に手で解いた答えの文字列が入っていないかどうかを調べると、
この一覧に含まれていました。

どうやら使えそうです。


6.機械的に解く。

じゃ、総当たりすればいいんですかね?
ということで適当にプログラムを書いてみます。

(言語は HSP.

origdic="seccon|accept|achieve|acquire|add|advance|affect|agree|allow|appear|apply|approach|argue|assume|avoid|bear|beat|belong|bite|care|catch|claim|communicate|compare|consider|consume|contact|contain|continue|cost|count|cover|create|cross|decline|define|depend|describe|destroy|determine|develop|die|disappear|discover|draw|earn|encourage|enter|establish|excite|exist|expect|explain|express|face|fail|fear|feed|fire|fit|flow|follow|gain|gather|get|guess|hit|hold|hunt|hurt|imagine|improve|include|increase|indicate|influence|insist|introduce|invent|involve|lay|lead|lie|lose|maintain|manage|manufacture|marry|mean|mention|miss|observe|offer|perform|please|prefer|prepare|press|prevent|produce|program|protect|prove|provide|publish|raise|reach|realize|receive|recognize|reduce|refer|reflect|refuse|regard|remain|remember|reply|represent|require|reveal|rise|risk|rule|satisfy|save|search|seat|seek|seem|serve|share|solve|sound|spend|spread|stay|steal|stick|strike|struggle|suffer|suggest|support|suppose|surprise|survive|tend|treat|vary|waste|wear|win|wonder|worry|action|activity|advantage|aid|amount|area|arms|aspect|atmosphere|attempt|attitude|audience|basis|behavior|benefit|bill|birth|blood|brain|case|cause|challenge|chance|character|choice|civilization|class|clerk|communication|community|company|competition|content|control|crowd|culture|customer|damage|degree|demand|desire|detail|development|difference|difficulty|direction|disease|distance|doubt|economy|education|effect|environment|event|evidence|exchange|exercise|experience|experiment|expression|fact|factor|failure|feature|field|figure|force|form|freedom|generation|god|government|growth|habit|history|idea|industry|information|issue|kid|knowledge|labor|lack|language|law|level|life|limit|line|literature|loss|majority|mark|market|mass|material|meal|measure|method|million|mind|mistake|moment|most|movement|nation|nature|note|object|office|opinion|opportunity|order|paper|party|period|phone|place|plant|pleasure|policy|population|position|power|practice|president|price|principle|problem|process|product|production|progress|purpose|quality|range|rate|reality|reason|relation|relationship|research|respect|response|rest|result|science|sense|shape|side|sign|situation|skill|society|sort|species|speech|stage|standard|state|step|stranger|stress|structure|subject|success|supply|surface|system|task|taste|technology|temperature|term|theory|trade|traffic|truth|universe|university|value|variety|view|war|weather|weight|afraid|ancient|available|average|aware|basic|certain|close|common|complete|complex|concerned|correct|direct|dressed|due|economic|environmental|equal|essential|expensive|familiar|famous|foreign|free|full|general|healthy|heavy|huge|human|impossible|individual|industrial|international|likely|local|major|married|medical|mental|modern|national|native|natural|necessary|obvious|ordinary|original|own|particular|past|personal|physical|political|popular|possible|practical|present|private|professional|public|recent|related|right|round|scientific|separate|serious|similar|single|social|special|strange|sure|thick|traditional|useful|various|vast|whole|wrong|abroad|actually|badly|especially|eventually|exactly|extremely|forward|frequently|generally|highly|however|immediately|indeed|later|maybe|merely|naturally|otherwise|particularly|pretty|probably|quite|recently|simply|therefore|although|unless|while|except|toward|worth|behind|abandon|absorb|accomplish|accompany|accuse|adapt|admire|admit|adopt|advertise|afford|aim|alter|annoy|appeal|arise|arrange|associate|attach|attend|attract|behave|bind|block|blow|borrow|breathe|collect|combine|command|compete|complain|compose|concentrate|conclude|confuse|connect|considerable|consist|construct|contribute|convey|convince|cope|criticize|decision|declare|decrease|defeat|defend|deny|derive|devote|disappoint|discuss|dislike|display|distinguish|disturb|divide|educate|emerge|emphasize|employ|enable|encounter|entertain|estimate|examine|expand|explore|export|expose|extend|fix|frighten|govern|graduate|greet|handle|hang|hate|hesitate|hire|identify|ignore|imply|import|impress|inform|intend|interpret|isolate|judge|notice|obtain|occupy|oppose|organize|overcome|participate|pause|perceive|permit|persuade|possess|praise|predict|preserve|pretend|promote|propose|punish|purchase|pursue|quit|react|recommend|recover|reject|release|rely|remind|remove|repair|replace|reserve|respond|retire|roll|rush|select|settle|sink|smell|stare|stimulate|stretch|suit|surround|suspect|tear|threaten|transfer|transform|translate|transport|vote|warn|account|addition|address|advice|affair|agent|agreement|agriculture|alternative|ancestor|anger|anxiety|appearance|assumption|association|author|authority|automobile|background|capacity|capital|career|characteristic|charge|circumstance|citizen|climate|conclusion|condition|conduct|conference|confidence|conflict|consequence|consumption|continent|contrast|contribution|conversation|cooperation|copy|creation|crime|crisis|criticism|crop|curiosity|custom|debate|debt|decade|definition|delight|democracy|desert|destruction|device|diet|disaster|discipline|discussion|distinction|district|drug|element|employee|enemy|entertainment|error|evolution|excuse|expert|explanation|extent|faith|fate|fault|favor|flight|focus|fuel|function|genius|goal|grammar|grant|guide|harm|height|household|humanity|ideal|imagination|immigrant|impact|impression|income|independence|instruction|intelligence|item|journey|joy|judgement|laboratory|landscape|laughter|leisure|lesson|luck|manager|manner|master|match|matter|merchant|murder|necessity|neighborhood|notion|novel|observation|occasion|occupation|operation|organization|origin|pain|passage|passenger|personality|phenomenon|philosopher|philosophy|physics|plenty|politician|politics|popularity|presence|profit|project|proof|property|proportion|proverb|psychologist|quantity|reaction|region|religion|remark|reputation|revolution|reward|row|security|self|shift|shortage|sight|significance|skin|soil|soldier|solution|statement|status|stock|strength|substance|sum|survey|survival|talent|theme|thought|threat|tongue|tradition|treatment|tribe|trust|union|vehicle|victim|violence|virus|vision|vocabulary|wealth|wisdom|witness|youth|accurate|actual|alike|anxious|appropriate|asleep|attractive|awake|biological|bored|brief|capable|chemical|civilized|comfortable|complicated|conscious|constant|contemporary|contrary|convenient|creative|critical|curious|current|dependent|distant|domestic|dramatic|dull|eager|educational|effective|efficient|elderly|emotional|empty|engaged|enormous|entire|evil|extra|extraordinary|extreme|fair|FALSE|fat|favorite|female|financial|firm|former|friendly|fundamental|gentle|global|harmful|historical|honest|immediate|independent|intellectual|intelligent|internal|junior|latter|literary|medium|military|mysterious|narrow|nearby|negative|nervous|nuclear|opposite|patient|pleasant|polite|positive|potential|previous|primary|primitive|proper|proud|rare|reasonable|remarkable|responsible|rough|rural|senior|sensitive|severe|significant|silly|slight|smart|solid|specific|stupid|sudden|suitable|superior|technical|terrible|tiny|tough|typical|unique|universal|unknown|unusual|upset|urban|useless|valuable|visible|vital|wealthy|welcome|well-known|willing|absolutely|alive|apart|closely|constantly|directly|entirely|fairly|forever|fully|gradually|largely|necessarily|nevertheless|normally|obviously|occasionally|possibly|properly|rapidly|seldom|slightly|somehow|somewhat|surely|totally|unfortunately|virtually|widely|wherever|despite|unlike|acknowledge|adjust|advise|amuse|analyze|assure|astonish|beg|bend|blink|bow|broadcast|burst|bury|capture|cease|celebrate|characterize|cling|commit|confine|confirm|confront|constitute|convert|cultivate|cure|dare|delay|deliver|depress|devise|diminish|disagree|discourage|dominate|dwell|eliminate|embarrass|endure|ensure|equip|evolve|exhaust|exhibit|fascinate|float|fold|found|fulfill|gaze|generate|grasp|guarantee|guard|illustrate|imitate|impose|inclined|industrialize|inspire|interfere|interrupt|investigate|justify|leap|melt|misunderstand|neglect|nod|offend|originate|overlook|owe|pour|pray|proceed|protest|rank|relieve|request|resist|resolve|restrict|retain|review|ruin|scare|scatter|scream|secure|specialize|spoil|strengthen|substitute|suppress|swallow|sweep|trace|undergo|urge|wander|weigh|whisper|yell|absence|accent|acceptance|access|acquaintance|affection|aggression|alarm|ambition|appetite|application|appointment|arrangement|athlete|avenue|band|border|burden|campaign|candidate|cash|category|cave|cell|charm|colleague|colony|committee|companion|comparison|complaint|complexity|composition|confusion|construction|contract|convention|courage|crash|crew|critic|description|dialect|dignity|disadvantage|dispute|division|divorce|document|ecology|economics|editor|emotion|emperor|enterprise|enthusiasm|equality|era|exception|executive|expense|explosion|extinction|facility|fairy|flame|fortune|foundation|frontier|fund|funeral|fur|furniture|garbage|gene|globe|grave|ground|harmony|harvest|honor|hunger|immigration|impulse|incident|infant|inhabitant|injury|insect|insight|instinct|institution|instrument|insurance|introduction|investment|liberty|limitation|load|location|logic|lord|lung|luxury|mail|mammal|mineral|minority|mood|motive|myth|neighbor|nerve|obligation|orbit|output|owner|participant|passion|patience|perception|perspective|pile|pioneer|poison|portion|possession|preference|prejudice|privilege|profession|pronunciation|prospect|punishment|pursuit|ray|recognition|reference|reflection|relief|requirement|resident|ritual|root|sacrifice|scholar|seed|servant|shade|shame|shelter|shore|similarity|site|specialist|statistics|steam|strip|stuff|suburb|tale|telescope|tension|territory|text|tide|tip|tone|traffic jam|tragedy|trail|trait|transportation|trap|treasure|trial|trick|unemployment|version|virtue|volunteer|voyage|wage|weapon|Westerner|absolute|abstract|accustomed|additional|adequate|aggressive|amazing|annual|apparent|artificial|Atlantic|atomic|awful|based|brilliant|calm|casual|civil|classical|definite|delicate|democratic|desirable|dirty|distinct|elaborate|electrical|elementary|equivalent|evident|exact|excessive|external|frequent|generous|genuine|grand|guilty|identical|inevitable|inferior|initial|inner|intimate|invisible|keen|latest|legal|liberal|located|logical|long-term|massive|mature|mechanical|minor|mutual|numerous|odd|overwhelming|painful|passive|peculiar|permanent|plain|precious|precise|precisely|prime|principal|profound|racial|rational|raw|relative|reliable|remote|routine|rude|satisfactory|sensible|spare|spiritual|steady|strict|subtle|sufficient|tremendous|tropical|ultimate|uncomfortable|unexpected|unlikely|unpleasant|verbal|visual|widespread|aloud|altogether|barely|commonly|consequently|deliberately|effectively|essentially|firmly|increasingly|literally|practically|primarily|readily|regardless|regularly|roughly|socially|steadily|traditionally|undoubtedly|whereas|beneath"

TEXTBOXADDR = 0xA098E
PROGBARADDR = 0x110C6A

sysfont 17
split origdic,"|",dic
prog = 0
repeat
if prog > 299 : break
last = "HELLO SECCON"
sendmsg TEXTBOXADDR,0xC,0,last
await 0
repeat length(dic)
sendmsg TEXTBOXADDR,0xC,0,dic(cnt)
sendmsg PROGBARADDR,0x408
if  prog != stat: prog = stat: title "Q."+stat+" - HIT: "+dic(cnt): break
loop
loop
title "DONE."

 

使い方としては TEXTBOXADDR と PROGBARADDR にウィンドウハンドルの値を与えて実行すれば、

あとは3分程度ほったらかして置くだけで答えが表示されています。

仕掛けとしては、

1. テキストボックスに WM_SETTEXT (0xC) メッセージを送り、任意のメッセージで初期化する。

https://msdn.microsoft.com/ja-jp/library/windows/desktop/ms632644(v=vs.85).aspx

2. テキストボックスに取得した辞書の単語を一つ取り出して送る。

3. プログラムバーに PBM_GETPOS (0x408) メッセージを投げて現在の進捗を調べる。

https://msdn.microsoft.com/en-us/library/windows/desktop/bb760830(v=vs.85).aspx

4. 進捗が 299 を超えていればソルバを終了する。

というような流れです。

 


Appendix.

じゃ、どうやって守ればいいのというところですが・・。

私もプレイヤーですので詳しく書くと色々と対策されそうなのでボソボソッと。

(でももう、聞かれたら答えようかなとも思ってます。。

たとえば今回私が使用した SendMessage 系は

Windows の昔ながらのコンポーネントが問題で使用されていた為に使えたというところがあり、

そうでなければ防げたのかなとも。

あとは、メモリに展開したデータをそのままにしておくというのも、あんまり・・と思ってみたり。

それ以外にも気になった点はいくつかありました。

・・・時間が出来たら、私がもし作問者側ならどう対策しよう・・というのを実験してブログ記事を書いてみたいところです。


そんなこんなで、久しぶりに CTF でワイワイした、そんな2日間(?)でした。

(そんなわけで、 CTF Advent Calendar 2015 の記事にもしてみました。

MS 実装の csharp コマンドである “csi” コマンドを使ってみた。

みむらです。

今朝方、新潟の日本酒を飲みに行こうかなぁ・・ ( http://anisec.jp/yuzawa/ ) と思っていた所、
鋭敏電子の秋月さんも「こっ・・これはっ・・!」となる記事を見かけ、
いても経ってもいられず、移動中の車内で試してみることにしました。

記事としては次の記事。
http://blogs.msdn.com/b/visualstudio/archive/2015/10/08/visual-studio-2015-update-1-ctp.aspx

Visual Studio 2015 の Update 1 CTP がリリースされましたよという記事なのですが、
その中に、”Visual C# Interactive Compiler..” というものがありまして、
どうも見てみると、 mono の csharp コマンドのようなことをするプログラムのようで、
これは確かめなければっ・・! ということで現在に至ります。


使ってみた:

image

TAB による推測が出ないので、少し入力しづらいという点はありますが、
C# らしいコードを普通に書いて、ごにょごにょできるのはとても素晴らしいと思います。


インストール方法:

ダウンロードの URL がとても見つけづらいのですが、
Visual Studio 2015 Update 1 CTP
ここからダウンロードが可能です。

セットアップを開始すると、
image

こんな感じのおなじみの画面でセットアップが行われていきます。

終わりましたら、 「Visual Studio コマンドプロンプト」から “csi” コマンドで起動できます。

Windows で特定の IP アドレスが静的に設定できない場合

みむらです。ちょっとしたメモ。

色々と弄っていましたら、IP アドレスの静的な設定で
特定のアドレスだけ設定しようとしてもその値がクリアされるという問題が起きていました。

その解決法を見つけましたのでメモ。


netsh int ipv4 reset netsh int ipv6 reset

 

早い話が netsh コマンドを使って全部のアダプタ設定をリセットする、という内容です。

コマンドを入力した後マシンを再起動し、

IP アドレスを設定し直すとうまくいくと思います。

DNS リゾルバキャッシュの内容を表示する

どうもみむらです。

Windows は内部に DNS キャッシュを持っていまして、
その中身というのはやはり見てみたいものです。

ただ見るだけであれば、
ipconfig /displaydns
と打てば一覧で出てきてしまいますが、
今回は API を呼び出して取得してみます。


情報を取得するためには、dnsapi.dll にある “DnsGetCacheDataTable” という API を呼び出します。

#include <Windows.h>
#include <WinDNS.h>
#pragma comment(lib,"Dnsapi.lib")

typedef LSTATUS(WINAPI *PDnsGetCacheDataTable)(PDNS_RECORD*);

void main()
{ 
	PDNS_RECORD entry; PDnsGetCacheDataTable dgcdt = (PDnsGetCacheDataTable)GetProcAddress(LoadLibrary(L"dnsapi.dll"), "DnsGetCacheDataTable");
	dgcdt(&entry);
	DnsRecordListFree(entry, DnsFreeRecordList);
}

ヘッダファイルに書かれていない API ですので、GetProcAddress で関数アドレスを取得して

動的に呼び出してやる必要があります。

image

実行しますとこのように、 “pNext” に次の情報が入った

「片方向のリンクリスト」の形で情報が入ったデータが返されます。

 

さらにここから、IP アドレスも求めるということであれば、

DnsQuery 関数を “DNS_QUERY_NO_WIRE_QUERY” ( キャッシュのみに問い合わせるオプション )を付けて呼び出すことで求まります。

#include <Windows.h>
#include <WinDNS.h>
#include <stdio.h>

#pragma comment(lib,"Dnsapi.lib")
#pragma comment(lib,"ws2_32.lib")

typedef LSTATUS(WINAPI *PDnsGetCacheDataTable)(PDNS_RECORD*);

void main()
{
	PDNS_RECORD entry, orig_entry, data;

	PDnsGetCacheDataTable dgcdt = (PDnsGetCacheDataTable)GetProcAddress(LoadLibrary(L"dnsapi.dll"), "DnsGetCacheDataTable");

	dgcdt(&orig_entry);
	entry = orig_entry;

	while (entry != NULL && entry->pNext != NULL)
	{
		DnsQuery(entry->pName, DNS_TYPE_A, DNS_QUERY_NO_WIRE_QUERY, 0, &data, 0);

		if (data != NULL)
		{
			IN_ADDR addr;

			addr.S_un.S_addr = data->Data.A.IpAddress;
			printf("%S : %s\n", entry->pName, inet_ntoa(addr));
		}

		entry = entry->pNext;
	}

	DnsRecordListFree(orig_entry, DnsFreeRecordList);
}

実行結果としてはこんな感じ:

image

・・・私がどこによくアクセスするかが丸わかりですね・・


というわけで・・

このような感じで、リゾルバキャッシュのデータを取り出すことが出来ました。

ですが、一点注意点として

“DnsGetCacheDataTable” 関数は MSDN にて明確にドキュメント化されていません。

ですので、今後呼び出し方法が変更される可能性は十分にあります。

使う場合は “現状は動く” 程度でとらえて頂ければと思います。