雑記」カテゴリーアーカイブ

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 でやってるんですよね。

うーんやっぱりやらないとなぁ。

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

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

みむらです。

ルータを買ったのはこれがやりたかったから(
(とはいえ、出来るか確認は取っていなかったので今回良かったなとw)

 

作り方:

1. ヤマハルータ側で VLAN の設定をする
2. Hyper-V 側で VLAN の設定をする


1. ヤマハルータ側で VLAN の設定をする

このあたりが参考になります:
http://jp.yamaha.com/products/network/solution/switch-command-tag_vlan/

具体的には、

vlan lan1/1 802.1q vid=51 name=YUI_ICHII
ip lan1/1 address 192.168.51.1/24
dhcp scope 51 192.168.51.2-192.168.51.250/24

こんな感じのコマンドを叩きます。

vlan lan1/1 802.1q vid=51 name=YUI_ICHII

vlan (LANアダプタ名)/(番号) 802.1q vid=(VID, VLAN ID) name=(名前)

こんな感じで呼び出せます。

今回の例では LAN1 上に一つめの VLAN を設定して、 VLANID は 51, 名前は YUI_ICHII となります。

ip lan1/1 address 192.168.51.1/24

いつもの IP アドレス設定ですね。ただ lan1/1 となっている所が VLAN 感出てます。

dhcp scope 51 192.168.51.2-192.168.51.250/24

いつもの DHCP 設定。

ちなみに dhcp scope 51 の 51 は、別に VLAN ID とかとは合わせる必要はないので

自分のポリシーに合わせて下さい(

 

・・・一通り叩くと VLAN が設定されます。

後はインターネットに出られるように nat の設定をしたり ip masquerade の設定もしておくと

良い感じだと思います。

 

2. Hyper-V での設定

image

各仮想マシンの設定画面の「ネットワークアダプター」の部分を開くと、

VLAN ID という項目がありそこに設定します。

ここでの VLAN ID は先ほどルータ側で VID として設定した値を入力します。

 

3.後は楽しむ


設定はこんな感じでさくさくっと出来ます。

もし通信周りでこれと絡めて遊ぶ場合は、

image

高度な機能の中に「ポートミラーリング」の設定項目もありますので、

この辺と組み合わせるとかなり楽しい環境がくめるのでは無いかと思います。

 

ではではー。

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

どうもみむらです。

夏です。夏と言ったら BIND そして、BIND といえばネットワーク。
そう、夏はネットワークの季節でもあるのです。

夏だ!ネットだ!ルーターだ! と某とある方が仰って(?)いたように
ルータを設置するには非常に最適な季節なんだそうです。

 

・・・嘘です。誰もこんなこと言ってません。

 

さてさて。

最近、東京エリアの気温が高くなっておりまして、
それ故にいろいろな問題が発生することも多々あるようです。

私の場合はこれですね。

IMG_0317

ノリで NVR500 を購入してしまいました。

 

いや、やっぱりヤマハさんのルータは触ってて楽しいです。

 

IMG_0320

(VAIO Z を WAN に、 VAIO Pro を LAN に繋いで遊ぶ、の図)

 

さてさて。そんなわけでいろいろとやっていた訳ですが、
どうも OCN が提供する IPv6 と ひかり電話を両立できない感じでして
いろいろといじりましたのでそれのメモ、を。


一応環境としては、
(ONU) – (NVR500) – (RT57i, PC, etc..)
というような。

また、コンソールケーブルには BUFFALO の BSUSRC06 を使いました。
Windows 8.1 x64 環境でしたが、接続したらすぐ使えるようになりました。 さすがっ。

 

 

ゴールとしては、

1. NVR500 を使って快適インターネット ( NTT レンタルのルータを取り外す )
2. ひかり電話を有効にする!
3. IPv6 !
4. RT57i での SIP クライアント!

という形です。

 

1. NVR500 を使ってインターネット接続を設定する

image

「プロバイダ情報の設定」にあるウィザードに従って設定すると、
ちゃんと設定が行われます。

・・私の場合はここで設定をした後、
config を出してきて不要と思われるところを消したりとかいろいろとやりました。

(自動でいろいろとフィルタを設定してくれるのはいいのですが、自分なりの番号の振り方がある場合などは結局コンソールでいじる事にはなります)

 

・・・・そもそもこういうルータを使う人なんだから・・という感がしますので細かいところはスキップします。

もし必要な場合は ヤマハ公式サイトにて :
http://jp.yamaha.com/products/network/solution/internet/telephony_nvr500/

 

2. ひかり電話を有効に

これも、「電話の設定」の「VoIPの設定」に
「フレッツ光ネクスト ひかり電話の設定」とありますので、こちらにて。

ただこの設定項目、プロバイダ情報として IPv6 PPPoE 接続をセットアップすると使えなくなります。

たぶんいろいろと大人の事情があるんだろうなと思いつつ。
今はさくっと IPv4 のプロバイダ設定だけした状態で、ひかり電話をセットアップします。

設定としては、こちらの設定データの「電話」の部分が参考になるかと思います:
http://jp.yamaha.com/products/network/solution/flets/flets_other_service/flets-next-ipv6_ipoe-nvr500/

 

 

3. IPv6 の設定

「プロバイダ情報の設定」から新規登録に進み、
一番上の「PPPoE を用いる端末型・・」を選択してウィザードを進めます。

image

 

IDやパスワードについては、
http://service.ocn.ne.jp/ipv6/access/flow/
このあたりを参考に。

設定が完了しましたら、コンソールからコマンドをカタカタと。

 

具体的には、 ( IPv6 が pp2 で、PC が LAN1, ONU が LAN2 に繋がっていると仮定)

pp select 2
 ppp ipv6cp use on
 ipv6 pp dhcp service client
 pp enable 2

no pp select

ipv6 route default gateway pp 2
ipv6 prefix 2 dhcp-prefix@pp2::/64
ipv6 lan1 address dhcp-prefix@pp2::1/64
ipv6 lan1 rtadv send 2 o_flag=on
ipv6 lan1 dhcp service server

こんな感じのことを。(そのまま貼り付けても設定可能です。

要は、DHCP で情報を取りに行ってプレフィックスを取得、

あとはそれをLAN 内に宣伝して、ルーティングの設定をすれば終わり、というような感じです。

 

もしフィルタ設定を書く場合は、通常の “ip filter” ではなく “ipv6 filter” にて。

ex)

ipv6 filter 200100 reject * * udp,tcp 135 *

ipv6 pp secure filter in 200100

 

あとは気づかないうちに宣伝されて、IPv6 ネットワークが使えるようになります。

 

4. RT57i で電話を繋ぐ

最近、秋葉原で安く売られてます。この子。

 

2D290831CCB64DA3ADB3FBD2CDBBFFC0_12001

(引用元: http://jp.yamaha.com/products/network/routers/rt57i/

この子、VoIP アダプタとしてもいろいろと遊べまして、

NTT から貸し出されるルータに対して SIP クライアントとして登録させることも出来ます。

 

今回は NVR500 との連携ということで。

 

4.1. カスケード接続を有効にする

NVR500 :

電話の設定 → TEL の共通設定 → カスケード接続(機器間アナログ通話)の設定 へ。

そこで、「切替」を「アナログ親機」にして「設定の確定」をクリック。

RT57i :

NVR500 の設定が完了したら同様に、

電話の設定 → カスケード接続(機器間アナログ通話)の設定 へ。

そこで、「切替」を「アナログ子機」にして「設定の確定」をクリック。

うまく行けばこの時点で、親機側から子機が、子機側から親機が見えるようになります。

 

4.2. あとはいろいろと設定を。

まずは着信・発信の設定を:

RT57i の 電話の設定 → VoIP の設定 → VoIPの基本設定 へ移動します。

電話ユーザ名を固定電話の番号に変更して完了です。

(着信させたくない場合は、「着信許可」の項目をいじると遊べます。)

マイナンバーの設定をする場合:

RT57i の 電話の設定 → ISDN 電話の設定 → (設定したいポート) →電話機対応機能設定 へ。


 


とてもざっくりですが、メモとして残しておきます。

あと詰みそうなところをいくつか:

 

・IPv6 アドレスが降ってこない

気長に待っていると降ってくることがあります。

 

・電話が繋がらない

一回 IPv6 と IPv4 を接続解除した後、IPv4 側だけを残して試行してみると繋がる可能性があります。

IPv6 側の接続は少し遅れてから行うと良い感じです。

接続に必要な情報を飛ばしている可能性や、

IPv4 側の接続ではなく IPv6 側に対して試行してるかも・・。

 

・RT57i が繋がらない

RT75i を一端 Cold start して初期設定にしてからやると、うまく行くかもしれません。

 


余談:

なんだかんだこのルータ、いろいろと機能を持っていまして、

VLAN とかはちゃんと切れるのはもちろん、USB 端子や Micro SD を使っていろいろと遊べそうです。

一番気になっているのはこの辺です。

http://www.rtpro.yamaha.co.jp/RT/manual/nvr500/logging/packetdump.html

パケットダンプ・・どういう形で出てくるんだろう。

 

何はともあれ、こんな感じでちゃんと PPPoE な IPv6 と ひかり電話は共存できるよ、と。

IMG_0323

・・ってなわけで、ステキなヤマハルータライフを!

 

・・最後に。私は N の人でも無く、Yのひとでもありませんので あしからず・・

SECCON CTF 2014 Web 予選に参加してみた!

どうもみむらです。

久しぶりの SECCON CTF ということでチーム一同ノリノリではしゃぎながら参加してきました。
・・チームは “wasamusume” です。 なんだかんだで今年も旗、振ってます。

 

とりあえず私が解いたのは、

*x86アセンブラを読もう (100)
*捏造された契約書を暴け (300)
*箱庭XSSリターンズ(300)
*箱庭SQLiチャレンジ(100)
*879,394bytes (100)

の5つ。

いくつか勘で解いてしまったところがあるので、
ちゃんと説明出来る所のみを。


*x86アセンブラを読もう

-----
01361000 >   55                 PUSH EBP
01361001     8BEC               MOV EBP,ESP
01361003     83EC 08            SUB ESP,8
01361006     C745 FC 00000000   MOV DWORD PTR SS:[EBP-4],0
0136100D     C745 F8 01000000   MOV DWORD PTR SS:[EBP-8],1
01361014     EB 09              JMP SHORT test.0136101F
01361016     8B45 F8            MOV EAX,DWORD PTR SS:[EBP-8]
01361019     83C0 01            ADD EAX,1
0136101C     8945 F8            MOV DWORD PTR SS:[EBP-8],EAX
0136101F >   8B4D F8            MOV ECX,DWORD PTR SS:[EBP-8]
01361022     3B4D 08            CMP ECX,DWORD PTR SS:[EBP+8]
01361025     7F 0B              JG SHORT test.01361032
01361027     8B55 FC            MOV EDX,DWORD PTR SS:[EBP-4]
0136102A     0355 F8            ADD EDX,DWORD PTR SS:[EBP-8]
0136102D     8955 FC            MOV DWORD PTR SS:[EBP-4],EDX
01361030    ^EB E4              JMP SHORT test.01361016
01361032   . 8B45 FC            MOV EAX,DWORD PTR SS:[EBP-4]
01361035   . 83E8 02            SUB EAX,2
01361038   . 8BE5               MOV ESP,EBP
0136103A   . 5D                 POP EBP
0136103B   . C3                 RETN
...
01361040 > . 55                 PUSH EBP
01361041     8BEC               MOV EBP,ESP
01361043     51                 PUSH ECX
01361044     C745 FC 00000000   MOV DWORD PTR SS:[EBP-4],0
0136104B     6A FF              PUSH FF
0136104D     E8 AEFFFFFF        CALL test.01361000
01361052   . 83C4 04            ADD ESP,4
01361055   . 8945 FC            MOV DWORD PTR SS:[EBP-4],EAX
01361058   . 8B45 FC            MOV EAX,DWORD PTR SS:[EBP-4]
0136105B   . 50                 PUSH EAX
0136105C   . 68 F4203601        PUSH OFFSET "FLAG{%d}\n"
01361061   . FF15 A4203601      CALL DWORD PTR DS:[<&MSVCR100.printf>]
01361067   . 83C4 08            ADD ESP,8
-----

 

いきなりこれが出ると、「ウッ」とするかもしれません。私もしました。

・・某キャンプの読経か・・と。

でも冷静に見てみると結構簡単なんですね。

---
01361000 >   55                 PUSH EBP
01361001     8BEC               MOV EBP,ESP
01361003     83EC 08            SUB ESP,8
01361006     C745 FC 00000000   MOV DWORD PTR SS:[EBP-4],0
0136100D     C745 F8 01000000   MOV DWORD PTR SS:[EBP-8],1
01361014     EB 09              JMP SHORT test.0136101F
01361016     8B45 F8            MOV EAX,DWORD PTR SS:[EBP-8]
01361019     83C0 01            ADD EAX,1
0136101C     8945 F8            MOV DWORD PTR SS:[EBP-8],EAX
0136101F >   8B4D F8            MOV ECX,DWORD PTR SS:[EBP-8]
01361022     3B4D 08            CMP ECX,DWORD PTR SS:[EBP+8]
01361025     7F 0B              JG SHORT test.01361032
01361027     8B55 FC            MOV EDX,DWORD PTR SS:[EBP-4]
0136102A     0355 F8            ADD EDX,DWORD PTR SS:[EBP-8]
0136102D     8955 FC            MOV DWORD PTR SS:[EBP-4],EDX
01361030    ^EB E4              JMP SHORT test.01361016
01361032   . 8B45 FC            MOV EAX,DWORD PTR SS:[EBP-4]
01361035   . 83E8 02            SUB EAX,2
01361038   . 8BE5               MOV ESP,EBP
0136103A   . 5D                 POP EBP
0136103B   . C3                 RETN
---
0136104B     6A FF              PUSH FF
0136104D     E8 AEFFFFFF        CALL test.01361000
---
0136105B   . 50                 PUSH EAX
0136105C   . 68 F4203601        PUSH OFFSET "FLAG{%d}\n"
01361061   . FF15 A4203601      CALL DWORD PTR DS:[<&MSVCR100.printf>]
---

もう、この辺だけ見ておけば大丈夫。

[EBP-4] とかいろいろと書かれていますが、

ぱっと見で Intel 記法だなーと思ったら、 
右辺のものを左辺に移す(結果が左に入る)と言うことだけ考えながら見ていきます。

(AT&T 記法なら、左から右へ。)

 

・・・あとはこれをじっくり読むと、

def func(n):
	a = 0
	b = 1
	while b <=n:
		a += b
		b += 1
	a -= 2
	return a

print("FLAG{%d}" % func(0xFF))

 

こんな感じに書き直せる訳ですね。

(・・ Write-up の醍醐味が全力でスキップされている気がするのは気のせい)

でもって、実行すると  FLAG{32638} ということで。

 

・・・スキップされて分からない! って人は後で個別に連絡ください(汗

 


捏造された契約書を暴け

ディスクイメージが渡されるので、

この中のデータから捏造の証拠を出してね、というもの。

当初 MFT (Master File Table) を見ていまして、

$FILE_NAME の Create Time じゃないかと送信していましたがどうも通らず。

・・まさかーと思いながら “機密保持契約書.docx” ファイル内にあるファイルを見ていったところ、

中の jpg ファイルに Exif 情報として作成日時が乗っていまして、これが Flag.

 

・・・でも、 Exif としてファイルに書かれている情報よりも、

MFT の fnMFTModTime が “2012/5/23 04:56” になっている事の方が、

信頼性が高いと思うのですが、うーむ(

 


今回参加してみまして、結構楽しかったです。

ただ最近、片手間でCTF をする感じではマズいなーと思っていまして

(大会形式の CTF 以外はほぼやってませんし・・。)

ちょっと勉強なりを始めないとマズいかなと思ってます。

 

また、やはり思うのは

ということで、次こそはメンバー集まってワイワイやりたいですね!

(同じ大学のメンバーとは一緒にやりました。これはこれで楽しかったです。)

「勝ちに行くぞ-!」というような場合はあれですが、

基本的に SECCON は「みんなで楽しんでいこう-!」という感でやっているので

気の合う仲間と気楽にやっていきたいですね。

 

最後に、チームの他のメンバーが書いたブログへのリンクを貼り付けておきます。

あたがわさん:

http://blog.atgw.jp/archives/2865

hyt さん:

http://11haanyan24.com/seccon-2014-quals-online-japan%ef%bc%88write-up%ef%bc%89/

かーみーさん:

http://diary.carme-ln.net/2014/07/22/writeup-seccon-2014-online/

zip さん:

http://zipsan.pw/archives/305

『チームとしては正攻法ではないっぽい方法で解いたようなので』

・・ごめんなさい、私がこの問題のフラグを submit したあたりで察してください(

ではではー。