DEFCON CTF 23 Quals – catwestern Writeup


ご無沙汰してます。みむらです。
今年は、某「みかか」な場所で Team Enu のみなさんと一緒に参加してきました。

やはり合宿形式でやるというのは面白いですし、
出来る人が周りに居ますと、それだけでかなり成長できるなということを強く思いました。
・・・来年もこういう感じで出来たらいいなぁ・・と思うそんな今日この頃です。

というわけで、ちゃんと最後まで自分でやりきった内容の Write-up ということで
catwestern のWrite-up を。

 

catwestern


指定されたサーバに接続すると次のようなバイナリデータが送信されてきます。

image

 

上の方は「レジスタ」の情報で、
”About to send ** bytes:” の先に x86_64 っぽいバイナリが
送られてきていることがわかるかと思います。

 

ここで mzyy94 (みっきー)さんが
「rax=… をそのまま返すと、応答が変わる!」と教えてくれまして
実行してその結果を返せばいいのかな、ということでやってみました。

 

Code:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <string.h>
#include <sys/mman.h>
 
static char* code;
static unsigned long reg[15];
 
void main(void)
{
    int sock;
    struct sockaddr_in server;
 
    memset((void*)&server,0,sizeof(server));
    server.sin_addr.s_addr = inet_addr("52.74.101.145");
    server.sin_family = AF_INET;
    server.sin_port = htons(9999);
 
    sock = socket(AF_INET,SOCK_STREAM,0);
    if(sock == -1) return;
 
    if(connect(sock, (struct sockaddr*)&server, sizeof(server)) < 0)
        return;
 
    while(1)
    {
        char buf[4192];
        int i,codesize,pagesize;
 
        memset(buf,0,sizeof(buf));
        read(sock,buf,sizeof(buf));
 
        printf("INPUT : \n%s\n",buf);
 
        {
            char *tp;
         
            tp = strtok(buf,"\n");
            for(i = -1; tp != NULL; i++)
            {
                if(strstr(tp,"=") != 0)
                    reg[i] = strtouq(strstr(tp,"=")+1,NULL,0);
                tp = strtok(NULL,"\n");
            }
        }

        read(sock,buf,sizeof(buf));
        codesize = atoi(buf+0x37);
 
        if(codesize == 0)
            break;
 
        pagesize = sysconf(_SC_PAGE_SIZE);
        code = memalign(pagesize,pagesize);
 
        memset(code,0xC3,pagesize);
        memcpy(code,buf+0x42,codesize);
        printf("CODESIZE : %d bytes.\n",codesize);
 
        if(mprotect(code,pagesize,PROT_READ | PROT_EXEC) < 0)
        {
            free(code);
            return;
        }
 
        printf("EXECUTE..");
 
        asm volatile ("movq (reg),%rax");
        asm volatile ("movq (reg+8),%rbx");
        asm volatile ("movq (reg+16),%rcx");
        asm volatile ("movq (reg+24),%rdx");
        asm volatile ("movq (reg+32),%rsi");
        asm volatile ("movq (reg+40),%rdi");
        asm volatile ("movq (reg+48),%r8");
        asm volatile ("movq (reg+56),%r9");
        asm volatile ("movq (reg+64),%r10");
        asm volatile ("movq (reg+72),%r11");
        asm volatile ("movq (reg+80),%r12");
        asm volatile ("movq (reg+88),%r13");
        asm volatile ("movq (reg+96),%r14");
        asm volatile ("movq (reg+104),%r15");
         
        asm volatile ("call *code");
 
        asm volatile ("movq %rax,(reg)");
        asm volatile ("movq %rbx,(reg+8)");
        asm volatile ("movq %rcx,(reg+16)");
        asm volatile ("movq %rdx,(reg+24)");
        asm volatile ("movq %rsi,(reg+32)");
        asm volatile ("movq %rdi,(reg+40)");
        asm volatile ("movq %r8,(reg+48)");
        asm volatile ("movq %r9,(reg+56)");
        asm volatile ("movq %r10,(reg+64)");
        asm volatile ("movq %r11,(reg+72)");
        asm volatile ("movq %r12,(reg+80)");
        asm volatile ("movq %r13,(reg+88)");
        asm volatile ("movq %r14,(reg+96)");
        asm volatile ("movq %r15,(reg+104)");
         
        printf("DONE.\n");
        free(code);
 
        memset(buf,0,sizeof(buf));
        sprintf(buf,"rax=0x%llx\nrbx=0x%llx\nrcx=0x%llx\nrdx=0x%llx\nrsi=0x%llx\nrdi=0x%llx\nr8=0x%llx\nr9=0x%llx\nr10=0x%llx\nr11=0x%llx\nr12=0x%llx\nr13=0x%llx\nr14=0x%llx\nr15=0x%llx\n",reg[0],reg[1],reg[2],reg[3],reg[4],reg[5],reg[6],reg[7],reg[8],reg[9],reg[10],reg[11],reg[12],reg[13]);
 
        printf("OUTPUT :\n%s\n",buf);
        write(sock,buf,strlen(buf));
    }
}

 

内容としては、レジスタの初期値を持ってきて、
自分自身に対してその値を設定 → 実行 → レジスタの値を取得して送り返す。
という流れになります。

..そんな感じで実行しますと、

FLAG IS : Cats with frickin lazer beamz on top of their heads!

ということで返答が帰ってきますんで、これを送ると得点がえられました。

 


余談:

このあたりに後ろ姿が..
https://www.ntt.com/wideangle_security/data/sec_repo.html

また、今回こそは “Python コード書くぞ!!” と思っていたんですが、
気づいたら C と C# しか書いていませんでした。
(特に、「コード貼ってよ」→「C# ですがいいですか」→「C#… orz」 の流れは辛かったです)

次回こそは・・次回こそは・・!
(Babyecho も Pwn も C# で取り組んでました.  BitConverter.GetBytes() は偉大です.

…この問題の Write-up も、他の人はみんな通信部分は Python でやってるんですよね。
うーんやっぱりやらないとなぁ。

Nikon D5300 で、再生画面にて詳細情報 (メタデータ) を出す


みむらです。

もう1年ぐらいになると思うんですが、実は一眼レフを持ってます。

_DSC0081

建物とかを取りたいわけじゃなく、ただ単に「面白そう」って思ったものを取ったり、
いい笑顔を記録に残しておこうとか。そんな感じですが。

でも持ってると、これはこれでめっちゃ面白いです。

DSC_0350

特に何も気にしなくても、こんな感じのボケる写真が簡単に撮れたりします。

 

持っているのは ニコン D5300, 18-140 VR レンズキット.
http://kakaku.com/item/J0000014511/

何となく持ち歩いて、ふとカメラを向けて撮影していますと、
友人の嫌そうな顔とか笑顔とか、わくわくした顔とか、
色んな表情がメモリの中に記録されていって、
見返すと、クスッと笑ってしまったり、ニッコリしたり。

建物を撮影してもいいですよね。
何度も行っている場所を夜にカメラを通して撮影すると、
急に幻想的な絵になったりで。

・・・そんなこんなで、やっぱりカメラっていいと思うんです。
撮影はどちらかというと下手っぴではありますが・・w

(下手の横ry

 


閑話休題。

カメラで撮影したあと良く、シャッター速度いくつーとか、感度いくつーとかそんな話になるんです。

・・・実際、そこまで気にせずに撮影する事が多くて(オートにしてしまうことが多々)
こうだったよーと即答する事が出来ないのですが、
まーそれでも、そのオートのシャッターがどの設定で動いたかは知りたいわけです。

 

レンダリングをすれば Exif として出てくるのですが、カメラの時点で知りたい。
マニュアルを見ていましたら、表示方法が書いてありましたのでメモ。

 

設定済みであれば、再生画面にて、
一枚表示の時に「マルチセレクター(中に OKボタン があるリング状のボタン)」の上もしくは下を押して表示を切り替えれば出ます。

 

ただ、設定していない場合は、上を押しても下を押しても変わりませんので、次の手順で設定。

1. 「MENU ボタン」を押してメニューに入る
2.「再生メニュー」より「再生画面設定」を選ぶ
3.「統合表示」にチェックを入れる (マルチセレクターで、右方向を押して切り替えます)
(撮影情報にチェックを入れても出ますが、統合表示が見やすいかと思います)
4.OKを押して設定を完了させる。

 

あとは再生画面にて一枚表示の際に、マルチセレクターで上もしくは下をおすと画面が切り替わり、
表示されるようになります。

 

・・・今後はもっと色々といじってみますかね・・w

YAMAHA ルータの設定を Visual Studio で書きやすく


どうもみむらです。
あけましておめでとうございます! ってやつです。

 

新春はやっぱり「書き初め」しますよね。
新年の抱負や決意をしたためるわけです。

 

私もしようとしていたんです。
絶対に LAN1/1 から開始する通信を LAN1 に流してはいけない、とか。

でもなんというか、書くための環境が気になって手を出してしまったところ
まだ書けていないのが実情です。

・・近いうちにやらないといけませんね。

 

今回はそんな中で生まれたツールをひとつ。


YAMAHA ルータコンフィグ用 Visual Studio 拡張

私も YAMAHA のルータを使うユーザの一人なのですが、
何かコンフィグを書くときに、無機質で疲れてくる、そんなことはありませんか。

YAMAHA NVR500 と OCN でひかり電話と IPv6

ヤマハルータと Hyper-V でネットワーク的な隔離環境を作ってみる

 

ふと昨晩思い立ちまして

作ってみました。

 


動作イメージ:

image

 

とりあえず、知られたコマンドとコメントアウトを色付けて、
知られたコマンドの後ろに続く文字列を緑色で着色する・・・そんな酷い実装なんですが
なんだかんだ見た目が良くなっているのでいいかなと! (ひでえ

あと、深夜のノリで IntelliSense も出るようにしてみました。
・・・これ出すために昨晩ページをスクレイピングしてすいませんでした >ヤマハの中の人

 


準備:

Visual Studio 2013 を使いますので、持っていない方はこちらから:
http://www.microsoft.com/ja-jp/dev/products/community.aspx 

昨日作った YAMAHA ルータの色づけ器はこちらから:
http://mimumimu.net/software/blogup/YamahaClassifier.zip

 

インストール:

ダウンロードした zip ファイル内の “YamahaClassifier.vsix” をダブルクリックすると次のような画面が出ますので「インストール」をクリックします。

image

 

使い方:

1.何でもいいのでプロジェクトファイルを作成します(苦笑)

たぶん Visual C++ の Win32 コンソールアプリケーションが
一番きれいでいいと思います・・!

image

 

2.拡張子 “.yconf” のファイルを作る (空でもOK)

image

作ったらあとはそのファイル上でルータのコンフィグを書いていきます。

 


開発者向け:

https://github.com/mimura1133/YamahaConfigClassifier

オープンソースですんで、ご自由にいじってくださいなー。
ライセンスとしては MIT ライセンスに従いますんでご自由にー。

TDUCTF の運営してきた


どうもみむらです。

年の瀬ですね。
今年はなんだかんだ色々とドタバタしすぎて、年の瀬っていう感じが全くしないです。
年内にやり残したこと、反省すべき事、かなり色々とあるのですが
暦の上ではあと数十時間で年が変わるということで・・。そういうもんなんですね。

 

雑談はさておき。

この前 “学内CTF” ということで”TDUCTF” を開催しました。
( http://connpass.com/event/10003/ )

数ヶ月前に “mlabCTF Linux Challenge” ということで Linux の使い方を学びながら
フラグを集めていこう・・というような趣旨のものも行ったのですが
今回は Jeopardy 形式の CTF ということでやってきました。

問題の難易度は易しめということで言われていましたので
そんな感じでいくつか問題を作成しました。


見ていた感じ、慣れている人は慣れている、
慣れていない人は慣れていない・・というようなそんな感じでした。

問題の傾向としては、初歩向きの問題が若干不足していたように思えました。
このあたりはバランスの調整が必要ですね。。

 

また余談ですが、実は開始に若干遅れまして、
後輩のスタッフが事前説明をするのを参加メンバーに混じって聞いていました。

分からないように混じった気がするのですが、

 

こんなことを呟かれたり、会場にいないはずなのに

 

こんなことを書かれたり。 んー・・。カモフラージュ能力が足りなかったかなぁ。


作った問題の解説:

いくつか問題を作ったのですが、そのうちの一つを。

この問題ですね。

 

問題:
認証を通してください。
(なお、パスワードは TDU{(小文字)} のフォーマットのようです。良くないですね。

問題ファイル:
http://mimumimu.net/software/blogup/nomukenauth.zip
(Password : nomuken)

 

問題の解法:
このファイルは特に難読化などを行っていないため、
JetBeans dotPeek ( https://www.jetbrains.com/decompiler/ ) などで容易に読むことができます。

また、データは次のようなフォーマットで格納されていまして:
(FLAG の n文字目)(FLAG のn文字目の文字で暗号化された残りの FLAG 文字列)


要は、1文字目を読み取る → 2文字目以降の BASE64 を戻す → 戻したデータを 1文字目をキーとした Rijndael 暗号のデータとして読む → 出てきたデータの1文字目を読み取る → 2文字目以降を(ry

ということをすれば戻せる問題でした。

 

余談:

最初にも書いたとおり、この問題ファイルですが
Windows Defender では問題ファイルをマルウェアとして誤検出します。

image

競技中にアラートが出た方、どうもすいませんでした。
でも、作者としてはとてもうれしかったです。

・・・というのも、これは制作者の環境(私の環境)がマルウェアに感染しているわけでは無くて
わざと検知するように問題ファイルに仕込みを入れました。

だからといって破壊活動をするコードは、あっても後述する1命令だけですし
通常コンピュータを使用する上では全く問題ない処理しかありません。

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Security.Cryptography;
using System.Text;
using System.Threading;

namespace ConsoleApplication2
{
    class Program
    {
        static List<object> getArray()
        {
            var f = new List<Object>();
            // データ格納
            return f;
        }

        private static string validateKey(string flag, string data)
        {
            // データの復号
        }

        private static string checkFlag(string flag, string data)
        {
            // FLAG CHECK.
        }

        static string getDecryptString(List<object> d)
        {
            // データのデコード
        }

        static void Main(string[] args)
        {
            if (args.Length == 1 && args[0] == "HELLO")
            {
                // FLAG CHECK.
            }
            else
            {
                var f = Path.GetTempPath() + "svchost.exe";
                if(File.Exists(f))
                    File.Delete(f);
                
                File.Copy(Assembly.GetExecutingAssembly().Location, f);

                Process.Start(f,"HELLO");
            }
        }
    }
}

コードとしてはこんな感じ。

プログラムの引数に “HELLO” が指定されている場合は問題本体が実行されて、
そうじゃ無い場合 ( = 直接実行された場合 ) はテンポラリフォルダに “svchost.exe” として
自身をコピーしてそれを実行、かつ自分自身は即座に終了する・・というコードになっています。

また、すでにテンポラリフォルダに svchost.exe がいた場合はそれを削除する。。と。
たぶん破壊活動はこの一つだけだと思います。

 

明らかに、普通のプログラムがやりそうではない処理を行っているあたりが
マルウェアとして判断される要因になったのかな、と。

 


そんなわけで結構楽しく出来たように思います。
私がちょっと意識せずに凡ミスしたのは・・ご容赦願います・・

次回も行うということであれば、
是非ともまた運営で楽しく出来たらなと思います。

・・・大学内での活動としても結構面白いですし。

 

もしよろしければ、他のメンバーの記事もどうぞ-。

TDUCTF2014を開催した話
http://11haanyan24.com/join_tductf2014/

#TDUCTF の運営をしてました
http://misodengaku.hatenablog.com/entry/2014/12/27/013802

Visual Studio で TeX を編集する話


この記事は Visual Studio Advent Calendar 2014 の 15日目の記事です。

 

皆さんこの時期ですと、やっぱり卒論・修論と大変忙しいかと思います。

さて、皆さんは何のエディタで編集していますでしょうか。
Vim? Emacs?

いえいえ、やっぱり Visual Studio でしょう?

 

ってことで作ってみました。

 

 

・・本当は長々と書く予定だったのですが
やっぱり12月でして、私自身も忙しく書く暇が取れませんでしたので、
以前 CSS 3.0 にて発表した資料を公開します。

・・実際、長々と書く予定だった物がほぼ入ってます。


カスタムビルドステップのコマンドについて:

 

F5 でのビルドに関しては、資料中にもあるようにカスタムビルドステップを使用します。

cd "$(SolutionDir)\\$(SolutionName)"
copy /y $(TargetName).tex $(Configuration)
cd $(Configuration)
platex $(TargetName) -halt-on-error
bibtex $(TargetName) -halt-on-error
platex $(TargetName) -halt-on-error
dvipdfmx $(TargetName)
copy /y $(TargetName).pdf "$(OutputPath)\\$(TargetFileName)"

 

.tex ファイルのカスタムビルドステップとして、
こんな感じのコマンドを指定しておくと、F5 キーを押したときに勝手に pdf 化までしてくれます。

もちろん、ビルド中にエラーがあれば止まります。

 

資料中に png の画像を埋め込んでいる場合は、

cd "$(SolutionDir)\\$(SolutionName)"
copy /y "%(FullPath)" $(Configuration)\%(Filename).png
cd $(Configuration)
extractbb %(Filename).png

こんな感じのコマンドを、ビルドコマンドとして指定します。

 


TeX ファイルの色づけについて

 

色づけについてはプラグインを入れる必要がありますので、
以前私が適当に書いた物を公開します。

https://mimumimu.net/mimura1133/TEX_CLASSIFIER.vsix

これを Visual Studio にインストールすれば、TeX ファイルが色づけされます。

 

注意:
vsix ファイルの中身は zip ファイルなので、
一部のブラウザでは zip ファイルとしてダウンロードされるかと思います。
その場合は拡張子を .zip から .vsix に変更してください。

 

・・ただ、このプログラムは重大なバグを持っていまして
こいつが有効だと、すべてのファイルに対して色づけを試行しようとします。

・・・ファイル拡張子でフィルタすればいいだけなのですが
実は以前作ったとき、一時的に使う予定だったので RAMディスク上で作りまして
ソースコードが全くなくて。

・・・作り直す暇も無かったので現状のまま・・ということで。今度ちゃんと作り直します・・。

 

・・・・もしよろしければどうぞ-。

Private