MawaLog

一日一日、楽しく生きる。技術と音楽が好き。

CTF、RSA暗号解読問題。大きな数の桁数をPythonでカウントする

サイバーセキュリティプログラミング ―Pythonで学ぶハッカーの思考

サイバーセキュリティプログラミング ―Pythonで学ぶハッカーの思考

RSA暗号の強度はモジュロのとする数(2つの素数の積)の桁数によって変わる

これの2問目を勉強中。もう数日経過。

SECCON Beginners CTF 2018 Write-up

RSA暗号の仕組みが大枠については理解できてきた。

この記事がよかった

解読法と素因数分解 – まいとう情報通信研究会

上記記事から引用すると、 「現在(2003 年かな?)のRSA暗号では素数素数を掛け合わせた後(法とする数)が 310 桁以上にもなる数を用いています。」

「2003 年の年末時点では素数素数を掛けた数が 174 桁の数が、100 台の業務用コンピュータで協調計算させて 3 ヶ月で素因数分解できることが実証されています」

つまりまとめると、

  • 2003年時点で、174桁の素数の積はすでに危険 
  • 2003年時点で、310桁の素数の積は実用的
  • こんかいのCTF4bは77桁でmsieveで2分で計算できる

状況このサイトの引用の引用をすると、わかります。

Electronic Journal: ●「RSA暗号は因数分解の原理使用」(EJ第4661号)

         スパコン 千倍高速コン 量子コンピュータ
因数分解/2百桁 約10年    約3日       数分
因数分解/1万桁 約千億年   約1億年   数時間~数日
                ──竹内茂樹著の前掲書より

これらが事実だとすると、量子コンピュータが実用段階に入るまではRSA暗号は単純に桁数を1万桁くらいまで増やせばいいこともわかります。なるほど・・・

CTFでの対策

以上の調査から、CTFで出てくるRSA暗号は正攻法で溶ける場合は、100桁以下で出題されそうだということがわかるので、その際の判断基準になる素数の積の桁数をpythonでちょっと測るという方法をメモしておきます。

#直感的にわかりやすい方法
>>> s = str("97139961312384239075080721131188244842051515305572003521287545456189235939577")
>>> list(s)
['9', '7', '1', '3', '9', '9', '6', '1', '3', '1', '2', '3', '8', '4', '2', '3', '9', '0', '7', '5', '0', '8', '0', '7', '2', '1', '1', '3', '1', '1', '8', '8', '2', '4', '4', '8', '4', '2', '0', '5', '1', '5', '1', '5', '3', '0', '5', '5', '7', '2', '0', '0', '3', '5', '2', '1', '2', '8', '7', '5', '4', '5', '4', '5', '6', '1', '8', '9', '2', '3', '5', '9', '3', '9', '5', '7', '7']
>>> sl = list(s)
>>> len(sl)
77

#単純に文字列にlenをかけてもでました・・・苦笑
>>> len(s)
77

77桁、これなら解ける!と判断すればいいわけですね。

最近読んだ・読み直した漫画

最近読んだ

BookOffで適当に買って読むなど。

CAとお呼びっ!


これは、久しぶりに家で発見したので3巻だけ読み直した。全巻読んだけどね。ちょっともうシチュエーション自体は10年、20年前かなぁという感じはするけど、人間模様が面白い。花津ハナヨさんの作品は好き。

僕の小規模な生活


BookOffで見つけた。面白かった。なんかこの漫画を描くところを、漫画にしているので、なんか変な感じが面白い笑。作者がポジティブ・ネガティブな面も含めて正直なのでリアリティを感じるし、なんか応援したくなる。明るい奥さんもいい存在感だなァ。

ヲタクに恋は難しい

ヲタクに恋は難しい (1)

ヲタクに恋は難しい (1)


これはコンビニで買った。なんか話題作ぽかったからノリで購入。うーむ。まあ最近はファッションオタクで陽キャって人もいるよね。この作品は、ふつうのオタクでリア充ではなく卑屈になっているという設定になっているけど、ストーリーを読むと、 リア充じゃん卑屈になる必要まったくないしコミュニケーションも普通に仕事とかでも取ってるし・・・オタクとは??ってツッコんでいた。多分時代とともにオタクの定義も多様化しているのかしら・・・

34歳無職さん


自分が35歳なので、年齢が近い登場人物の漫画には反応する。状況を書くとネタバレが激しいのでオブラートに包んで書くと、女性が主人公で、仕事をしていたけど、諸々事情があり、退職、1年位貯金で過ごしてみようという方針で淡々と日常を描く作品です。起承転結はないんだけど、不思議とつい全部読んじゃいます。という不思議な魅力の作品でした。続きが気になる・・・『よつばと』とか好きな人にはおすすめできるかも^^

素因数分解パッケージmsieveのMacOSXへの導入メモ[CTF for Beginners 2018]

セキュリティコンテストチャレンジブック -CTFで学ぼう! 情報を守るための戦い方-

セキュリティコンテストチャレンジブック -CTFで学ぼう! 情報を守るための戦い方-

経緯

この記事を元にCTF復習中 SECCON Beginners CTF 2018 Write-up

2問目は素因数分解するためにmsieveというパッケージがあると便利っぽいので、インストールすることになり経緯をとりあえずメモる。

手順

1:DL

DL先
https://sourceforge.net/projects/msieve/

2:DL後の解凍〜make all

#ダウンロードしたディレクトリにcd

$ tar xvzf msieve153_src.tar.gz
x msieve-1.53/
x msieve-1.53/aprcl/
x msieve-1.53/aprcl/jacobi_sum32.h
x msieve-1.53/aprcl/mpz_aprcl32.c
x msieve-1.53/aprcl/mpz_aprcl32.h
・・・
x msieve-1.53/zlib/trees.c
x msieve-1.53/zlib/trees.h
x msieve-1.53/zlib/uncompr.c
x msieve-1.53/zlib/zconf.h
x msieve-1.53/zlib/zlib.h
x msieve-1.53/zlib/zutil.c
x msieve-1.53/zlib/zutil.h

makeしてみる

$ cd msieve-1.53/
msieve-1.53$ ls
Changes     aprcl       build.cuda.vc14 cub     zlib
Makefile    bin     build.vc10  demo.c
Readme      build.cuda.vc10 build.vc11  gnfs
Readme.nfs  build.cuda.vc11 build.vc14  include
Readme.qs   build.cuda.vc12 common      mpqs
msieve-1.53$ make
to build:
make all
add 'WIN=1 if building on windows
add 'WIN64=1 if building on 64-bit windows
add 'ECM=1' if GMP-ECM is available (enables ECM)
add 'CUDA=1' for Nvidia graphics card support
add 'MPI=1' for parallel processing using MPI
add 'BOINC=1' to add BOINC wrapper
add 'NO_ZLIB=1' if you don't have zlib

make allってやらないとダメらしい。 ので、make all してみる

msieve-1.53$ make all
gcc -O3 -fomit-frame-pointer -march=native -D_FILE_OFFSET_BITS=64 -DNDEBUG -D_LARGEFILE64_SOURCE  -Wall -W -DMSIEVE_SVN_VERSION="\"Unversioned directory\"" -I. -Iaprcl -Iinclude -Ignfs -Ignfs/poly -Ignfs/poly/stage1 -c -o aprcl/mpz_aprcl32.o aprcl/mpz_aprcl32.c
aprcl/mpz_aprcl32.c:37:10: fatal error: 'gmp.h' file not found
#include <gmp.h>
         ^~~~~~~
1 error generated.
make: *** [aprcl/mpz_aprcl32.o] Error 1

参考記事と同じエラーが出てくるので想定内。gmpってのを入れよう。

3:GMPのダウンロード〜install

DL
The GNU MP Bignum Library

DL箇所はホームページ内の Download the latest release of GMPって言う場所のに以下のようにずらずら並んでいるリンクがあるからそれ。

GMP 6.1.2    lz, 1939430 bytes   xz, 1946336 bytes   bz2, 2386766 bytes
Main site, gmplib.org, via https    gmp-6.1.2.tar.lz    gmp-6.1.2.tar.xz    gmp-6.1.2.tar.bz2

そのうちのこれをクリックしてダウンロードした
gmp-6.1.2.tar.bz2

#ダウンロードしたディレクトリにcd
#解凍開始
$ tar zxvf gmp-6.1.2.tar.bz2 
x gmp-6.1.2/
x gmp-6.1.2/cxx/
x gmp-6.1.2/mini-gmp/
x gmp-6.1.2/Makefile.am
x gmp-6.1.2/configure

・・・

x gmp-6.1.2/cxx/osmpf.cc
x gmp-6.1.2/cxx/osmpq.cc
x gmp-6.1.2/cxx/osmpz.cc


$cd gmp-6.1.2
gmp-6.1.2$./configure 
gmp-6.1.2$make

#ぶわーっとなにか始まる。5分くらい?時間かかる

gmp-6.1.2$make check

#再びぶわーっとなにか始まる。時間数分かかるかな?

gmp-6.1.2$sudo make install

#終わる

これでよし。

4:msieveのインストール

#msieve-1.53のディレクトリに戻る。cd
msieve-1.53$ make all

再びぶわーっとなにか始まる。

5:msieve実行してみる

msieve-1.53$ ./msieve --h

Msieve v. 1.53 (SVN Unversioned directory)
usage: ./msieve [options] [one_number]

できたね。

試しに素因数分解もwriteupの記事のCTFの問題で出た数字のひとつについて素因数分解をやってみよう

$ ./msieve -e -p -q -v "97139961312384239075080721131188244842051515305572003521287545456189235939577"

ぶわーっと始まる

recovered 18 nontrivial dependencies
p39 factor: 299681192390656691733849646142066664329
p39 factor: 324144336644773773047359441106332937713
elapsed time 00:02:49

おお!2分弱くらいかな!解けてるすごいね^^

参考記事

ほぼこれの通りバージョンを変えるだけでした^^ bias.hateblo.jp

最近作っていたものの記録:不動産サービスの口コミサービス『Retechs』

f:id:k_mawa:20180530220511p:plain

これの開発に関わりました

retechs.net

最近一番大きなアプリ開発の仕事でした。明日正式オープン(もうオープンしてますけど苦笑)どのくらいかかっただろう・・・ 3ヶ月くらいか・・・これはえらい大変でした^^; 頑張ったゾウ^^/

アーキテクチャ

僕は基本的にバックエンド担当しました。もうひとりがフロントエンドを担当しています。バックエンドは下記のようなアーキテクチャです。

  • インスタンスAWS-EC2
  • 静的ファイルストレージ:AWS-S3
  • データベース:AWS-RDS(Postgre)
  • Webサーバー:Apache
  • Runtime:Python3.4(Elasticbeanstalkの対応バージョンこれが最新だから、多分。ちょっと古め)
  • バックエンドのフレームワークDjango(2.0.1)+Django REST Framework(3.7.7)

フロントエンドは、僕よくわからないので概要しかわかりませんが、最近注目されているvue.js+firebaseでの構築とのことです。(自分も今度多少チュートリアルやってみようかな・・・)

苦労したこと

これは、WebAPIの数と、それをフロントエンドチームに伝えるためのドキュメント作りです。一人開発だと、ドキュメントはEvernoteとかにメモくらいでいいので、こういう作業発生しませんが、チーム開発となるとAPIドキュメントの良し悪しで他の人にどういう仕様で開発したかが伝わるかどうか決まる=効率になっていくので、わかりやすくするのは大事なのですが、わかりやすくすると簡素さが失われて冗長になってしまったり、仕事時間が無限に膨れてしまうので、その兼ね合いがなかなか悩ましかったです。

このアプリ、APIの数が100超、200以下くらいになってしまったので、その分、githubwikiでひたすらAPIcurl例を書きまくり、その時間が開発時間の大半かなと思います。実装は全体の3割くらいです、多分。

と、いうわけで結構苦心したので、このアプリを大事に育てていきたいと思います^^/

CTF for Beginners 2018 で CTF問題演習 Crypto [Warmup] Veni, vidi, vici を解く

セキュリティコンテストチャレンジブック -CTFで学ぼう! 情報を守るための戦い方-

セキュリティコンテストチャレンジブック -CTFで学ぼう! 情報を守るための戦い方-

経緯

こういう感じで、 k-mawa.hateblo.jp

とりあえず、CTFにてもっと解けるように残った問題で手習い開始。

Crypto [Warmup] Veni, vidi, vici

1:問題をダウンロードする。

次のような文字列のファイルが見える

#part1
Gur svefg cneg bs gur synt vf: pgs4o{a0zber
#part2
Lzw kwugfv hsjl gx lzw xdsy ak: _uDskk!usd_u
#part3
{ʎɥdɐɹɓ0ʇdʎᴚ :sı ɓɐlɟ ǝɥʇ ɟo ʇɹɐd pɹıɥʇ ǝɥ⊥

ふーん。経験値が少なすぎてなんじゃこりゃ・・・って感じ。part3は可読だね。逆さになってるだけだ。逆さになってる文字列を180度回転するモジュールとかあるんかしら・・・

2逆さにした文字を戻す

rot180って通称で呼ばれているようだ。原理は下記のような感じ。W→Mに変換と似ている文字を探して置換しているだけ。

id.fnshr.info

pythonよく使うからpythonでできないかな。これ・・・で、ありました^^/

How to rotate a character or string by 90 or 180 degree in python? - Stack Overflow

upsidedownってモジュールかやってみよ。

$pip install upsidedown==0.3
#!python3.x系はエラー!
#python2.7.10でインストール成功

$python
Python 2.7.10
>>> import upsidedown
>>> print upsidedown.transform('hello world!')
¡pꞁɹoʍ oꞁꞁǝɥ

よしできた!やってみよう。

UnicodeDecodeError: 'ascii' codec can't decode byte 0xca in position 1: ordinal not in range(128)

ん〜もうこの辺は核心部分じゃないから、いいや。多分アルファベットくらいの対応表しか用意してなくて、十分な対応表がないんじゃないかな・・・そのメンテナンスが遊びの割に面倒だから、pythonモジュールあんまなかったのかも。ふつうにWebのツールでやろう。

Lunicode

一瞬でできた、楽やな^^

#part3 解決後
The third part of the flag is: Rypt0graphy}

3

part1,part2は、意味不明な文字列・・・The third part of the flag is: Rypt0graphy} をからすると、The first part of the flag is: … The second part of the flag is: …と、なりそうかなと当たりをつけることはできる。それで、文字自体は対応してないけど、区切りごとの文字数は同じ・・・つまりシーザー暗号かもね。ということで、調べてみた。

wikiわかりやすい。なるほど。アルファベットを半分にして、逆に対応させるのか。それでROT13か。なんかカッコイイな^^ ROT13 - Wikipedia

そのためのツールがpythonにはあると。今度こそpythonで解きたいよね。

blog.amedama.jp

#part1を解く
>>> import codecs
>>> str = "Gur svefg cneg bs gur synt vf: pgs4o{a0zber"
>>> codecs.decode(str, 'rot13')
'The first part of the flag is: ctf4b{n0more'

行けたやん!

4 part2を解く

>>> import codecs
>>> str = "Lzw kwugfv hsjl gx lzw xdsy ak: _uDskk!usd_u!"
>>> codecs.decode(str, 'rot13')
'Ymj xjhtsi ufwy tk ymj kqfl nx: _hQfxx!hfq_h!'

意味不明だなァ

ここでpythonの文字列の比較演算子の挙動をチェックしてみる…

>>> "a" > "b"
False
>>> "a" < "b"
True
>>> "a" < "a"
False
>>> "a" < "z"
True
>>> "a" < "B" <"z"
False
>>> "a" < "b" <"z"
True
>>> "z" < "b" <"z"
False

うーむつまり、単純に文字列がアルファベット順になっていればTrueというわけか。ふーん。

さらに調べると、アスキーコードの数字の大小で調べていることがわかった。つまりこういうこと。ordは組み込みメソッド

>>> ord('A')
65
>>> ord('B')
66
>>> ord('C')
67
>>> ord('a')
97
>>> ord('b')
98
>>> ord('c')
99

つまり1文字ずらすというのは

>>> chr(ord('A') + 1)
'B'
>>> chr(ord('Z') + 1)
'['
おっと循環しているわけではないか。
>>> ord('A')
65
>>> ord('Z')
90

解説を読みながらテスト

>>> str="J"
>>> chr((ord(str) - ord('A') + 13) % 26 + ord('A'))
'W'

OK、じゃあこれで1文字〜13文字までずらした結果を導く関数をつくってみるか。コード書こう。自分でもツールを作りたいからね^^

と、いうわけで小1時間くらい書いてできた!!

#str_rot_n.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import re

def str_rot_n(strings):
    strlist = list(strings)
    answer_list =[]

    for i in range(13):
        print("[+]Info:strings rot {}...".format(i+1))
        
        for j in strlist:

            if 'A' <= j and j <= 'Z':
                roted_str = chr((ord(j) - ord('A') + i+1) % 26 + ord('A'))
                answer_list.append(roted_str)

            if 'a' <= j and j <= 'z':
                roted_str = chr((ord(j) - ord('a') + i+1) % 26 + ord('a'))
                answer_list.append(roted_str)

            m = re.match(r"[a-z,A-Z]", j)
            
            if not m:
                answer_list.append(j)

        answer_list = ','.join(answer_list)
        answer_list = answer_list.replace(",","")

        print("[+]Info:strings rot {}: decode strings is '{}'".format(i+1,answer_list))

        answer_list =[]

これを動かすと・・・

>>> import str_rot_n
>>> str = "Lzw kwugfv hsjl gx lzw xdsy ak: _uDskk!usd_u"
>>> str_rot_n.str_rot_n(str)
[+]Info:strings rot 1...
[+]Info:strings rot 1: decode strings is 'Max lxvhgw itkm hy max yetz bl: _vEtll!vte_v'
[+]Info:strings rot 2...
[+]Info:strings rot 2: decode strings is 'Nby mywihx juln iz nby zfua cm: _wFumm!wuf_w'
[+]Info:strings rot 3...
[+]Info:strings rot 3: decode strings is 'Ocz nzxjiy kvmo ja ocz agvb dn: _xGvnn!xvg_x'
[+]Info:strings rot 4...
[+]Info:strings rot 4: decode strings is 'Pda oaykjz lwnp kb pda bhwc eo: _yHwoo!ywh_y'
[+]Info:strings rot 5...
[+]Info:strings rot 5: decode strings is 'Qeb pbzlka mxoq lc qeb cixd fp: _zIxpp!zxi_z'
[+]Info:strings rot 6...
[+]Info:strings rot 6: decode strings is 'Rfc qcamlb nypr md rfc djye gq: _aJyqq!ayj_a'
[+]Info:strings rot 7...
[+]Info:strings rot 7: decode strings is 'Sgd rdbnmc ozqs ne sgd ekzf hr: _bKzrr!bzk_b'
[+]Info:strings rot 8...
[+]Info:strings rot 8: decode strings is 'The second part of the flag is: _cLass!cal_c'
[+]Info:strings rot 9...
[+]Info:strings rot 9: decode strings is 'Uif tfdpoe qbsu pg uif gmbh jt: _dMbtt!dbm_d'
[+]Info:strings rot 10...
[+]Info:strings rot 10: decode strings is 'Vjg ugeqpf rctv qh vjg hnci ku: _eNcuu!ecn_e'
[+]Info:strings rot 11...
[+]Info:strings rot 11: decode strings is 'Wkh vhfrqg sduw ri wkh iodj lv: _fOdvv!fdo_f'
[+]Info:strings rot 12...
[+]Info:strings rot 12: decode strings is 'Xli wigsrh tevx sj xli jpek mw: _gPeww!gep_g'
[+]Info:strings rot 13...
[+]Info:strings rot 13: decode strings is 'Ymj xjhtsi ufwy tk ymj kqfl nx: _hQfxx!hfq_h'
>>> 

おお![+]Info:strings rot 8... [+]Info:strings rot 8: decode strings is 'The second part of the flag is: _cLass!cal_c'

というわけで、最後のパーツもそろった!

The first part of the flag is: ctf4b{n0more
The second part of the flag is: _cLass!cal_c
The third part of the flag is: Rypt0graphy}

あわせて、 ctf4b{n0more_cLass!cal_cRypt0graphy}

f:id:k_mawa:20180529003743p:plain

解けたぁ!!

解説

これを読みつつ復習中 ^^/

SECCON Beginners CTF 2018 Write-up

CTF初参戦!CTF for Beginners 2018 に参加してみた

セキュリティコンテストチャレンジブック -CTFで学ぼう! 情報を守るための戦い方-

セキュリティコンテストチャレンジブック -CTFで学ぼう! 情報を守るための戦い方-

CTF for Beginners 2018

2017.seccon.jp

参加してみた!何もわからんけど、どのくらい行けるかとりあえず参加。無料みたいだし。

1問解けたァ・・・

f:id:k_mawa:20180527171105p:plain

まあ初めてだし、1問だけでも解けたのは嬉しかった。IRCのチャットルームに行くだけ。そこの上の部分にFLAGがあるからコピペしたらOK。

順位

1問解けただけだけど、1214チーム中の823位。意外と自分みたいにとにかくチャレンジしてみようという人も多かったのかしら・・・

f:id:k_mawa:20180613023205p:plain

XSSのやつも解きたかったが、あきらめ

Webの1問目。

admin って入れると、偽管理人って$usename変数が変換されるけど、$usename == adminじゃないとFALGが出ない。javascriptコードでエスケープを避けようといろいろごちゃごちゃやるけど、時間内に出来ず。今後の課題だなぁ。POSTじゃなくてGETでもOKとのこと。この辺は勉強してるはずなのに気づかなかったくやし〜 ><

答え書いてくれてる方がいる

復習にいいな!^^/

SECCON Beginners CTF 2018 Write-up

日記

そういえば、今週の目標とか書けてなかった・・・あっという間に土曜日・・・

開発したアプリの運営が主な過ごす時間になってきた。ちょいちょい更新開発はしているのでコードは書いている。

自作OS本進めたいけど、まだ「はじめに」しか読んでない!