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

yamaguchi.txt

開発日記。備忘録代わりだよ。

サイバーコロッセオに参加したよ

CTF

3/5に秋葉原で行われたサイバーコロッセオ×SECCONというCTFの大会にチーム_hodge+mamaとして参加しました。結果は10位。まぁまぁです。
東京2020公認プログラムらしいです。あまり意味は無さそうですが承認欲求が満たされますね。

今回はオンサイトなのでking of the hill方式ということで、jeopadyとはちょっと変わった感じでした。
可視化エンジンはNIRVANA改で、攻殻CTFの時に見たAMATERASとはちょっと違う気もしました。NIRVANAのほうが若干オシャレな気がします。

今回の教訓は、絶対に性能の良いノートPCを買おうな!!!!!ということです。
素因数分解、scapy等ちょっと重い処理をさせたらフリーズし、競技中10回は電源をブチ切ったので頭の血管が破裂しそうでした。

個別の問題の感想はディスりになってしまうので省略しますが、SECCONだなぁ…という感じでした。
第六問の謎プロトコルモールス信号を二時間くらい考えて思いつかなかったのは本当に世界一頭が悪かったと思います。深く反省しています。
競技時間が短いからか、時間がかかるrevとかpwn系よりも思いつくか思いつかないか、知ってるか知ってないか系の問題が多かったと思いました。


f:id:yamaguchi_1024:20170306213756j:plain
f:id:yamaguchi_1024:20170306213807j:plain
NIRVANA改。おしゃれですね?

f:id:yamaguchi_1024:20170306213814j:plain
f:id:yamaguchi_1024:20170306213837j:plain
SAO好きにならねば…。と思って見たのですが安直なハーレム的な感じが好きになれませんでした。攻殻機動隊でいいよ。

f:id:yamaguchi_1024:20170306213844j:plain
証明がめちゃくちゃ青かったので自殺防止か?と思いました。

鬼畜眼鏡布教ブログ

雑記

高校生の時からやってみたいなと思っていた、鬼畜眼鏡という18禁BLゲームをプレイしました。
ありえないくらい良かったので布教するために記事を書きます。

まぁとりあえずOPを見てみてください。いいですよね。
www.youtube.com


今までやった18禁ゲーム(とは言っても恋姫無双と沙耶の歌しかないが)の中でシナリオがダントツに良く、今までの人生の中で初めて主人公が一番好きになりました。
BL好きな人でも好きじゃない人でも、誰にでもおすすめできるゲームです。鬼畜とは言ってもそこまでハードな凌辱はないし、何といってもシナリオが神なので是非プレイしてほしいです。

あらすじ

(公式HPより)
何をやっても裏目に出てしまい、失敗ばかりの営業マン、佐伯克哉。
リストラを目前にして、半ばあきらめていた彼の前に現れたとある人物。

  「これを身につけた瞬間から、あなたの人生は大きく変わります」

そういって手渡された、なんの変哲もない眼鏡。
それをかけた瞬間から、彼の人生は180°変わり始めた――。

その眼鏡をかけている間は、人が変わったように有能に仕事がこなせるようになったのだ。これで俺は今までの駄目な自分を捨て、変わることができる。

しかし、断片的によみがえる眼鏡をかけているときの自分の行動。 
これは本当に俺なのか? 一体俺は何をしているんだ?
そう、その眼鏡は、なんとかけた者を鬼畜に変える禁断のアイテムだったのだ…。

眼鏡の着脱によって、弱気な主人公(受)から鬼畜な主人公(攻)へと変身できる、アダルトリーマンラブストーリー。


感想

太一ルート→本多(ノーマル)→片桐→御堂(ノーマル)→本多(眼鏡)→アキ→御堂(眼鏡)
の順で攻略した。

太一ルートはシナリオが厚く説得力があり本当に良かった。太一の言動は納得できる人が多いのではないだろうか。
太一は克哉の家の近くにある喫茶店の店員。ちゃらんぽらんな感じがする一見普通の大学生だが、ストーリーを進めると太一の育った環境やその倫理観に驚くことになる。
歪んだ愛情ルートは最高だった。太一は克哉のことを「ここにいるのに、いない」と形容していたが、歪んだ関係になってしまうルートでは、克哉のことをどれだけ凌辱して侍らせても自分のものになったという満たされない気持ちだったんじゃなかろうか。救われなくて最高。
太一ルートと本多ルートは受け克哉が一番幸せになるルートなんじゃないだろうか。


片桐はあまり期待していなかったが、結果的には激シコだった。バツイチの課長がメンヘラ乙女だって誰が想像する?
仕事の能力も低く誰にも必要とされていないと感じ続けた片桐にとって、凌辱という行為であっても眼鏡克哉が自分を必要としてくれるのが嬉しかった。バッドエンドの刺殺ルートも他のキャラの刺殺よりCGがあるなど気合が入っており、メンヘラ感が出ていて非常に良かった。
「それは、僕が気が利かないおじさんだからかい?」
眼鏡克哉に凌辱され依存させられて捨てられた時に縋りついていったセリフがこれって、どんだけいじらしんだよという感じだった。
バッドエンド快楽落ちの時の「次は、僕も…」というセリフも可愛くて最高だった。


本多ルートは、王道というか克哉の心の闇を一番理解して慰めてくれるルートだった。
本多は克哉の同期で同僚で、ウザいくらい熱血な男なのだが、克哉との心の摩擦というかすれ違いがアツくて最高だった。
単細胞脳筋な所は攻めでしかなく、ノーマル克哉に対する優しい攻めはもちろん、眼鏡克哉に対しても対等?に攻めようと努力し(受けだが)ちゃんと自我を保っているところがすごい。
約束された攻めという感じ。


御堂攻めルートは王道凌辱という感じ。まあ普通?個人的には電話口であえぐ克哉の声を聴いて好きになっちゃう本多が救われなさ過ぎて好きだった。
御堂受け、あまり期待してなかった分刺激が強かった…。御堂ただでさえ美しいのに一年後に告白した時のCGが絵になりすぎて泣いた。
君は、強姦されると好きになっちゃうタイプのフレンドなんだね!って思っていた。
どれだけ凌辱されても絶対に屈しない芯の強さはもちろん、あんなことされても好きと言われただけで憎しみから愛情に変わってしまう繊細なところも最高。


アキは、ビジュアル的には好みなのだがシナリオが薄い感じがした…。残念…。
受けはアキみたいな淫乱猫みたいな感じより、堅物で真面目だけど弱気…みたいなのが好きなので微妙だった。
もうちょっと一ひねりあっても良かったんじゃないかな?


個人的には、学園ものなんかよりも舞台が会社でビジネスビジネスしているところがツボだった。世の中のリーマンすべてに優しい気持ちを持てるようになった。
エロシーンも良いのだが、それよりもホモが哲学しているシーンが好きということに気が付いたので、そういうゲームがあればぜひ教えてほしい。


ノーマル克哉は本当に最高で、こんなにMで可愛くて幸せにしたくなってシコい主人公はいないと思う。太一は「克哉さんって幸薄そうな感じ・・・。幸せにしたくなる感じ!」と言っていたが、本当にそうだし太一とはつくづく気が合うなぁと思う。
BLの主人公は幸薄そうであればあるほど、そこから救い出してくれる攻めが愛おしくなるから良い。
片桐とノマ克はまさに優しい弱気リーマンで、この二人に幸せになってほしいと心から思うのに、二人のルートがないことがさみしい…。
どちらが攻めでもなく、ゆるゆるとお互いに支えあう生活ができると思うんだけど…。

FPGAで自作CPUを動かしてみよう (1)

FPGA 作ったもの

この記事はIS17er advent calendarTSG advent calendar の15日目の記事として書かれました。cookies146、お誕生日おめでとうございます。これは、お誕生日プレゼントを作ろうとする試みです。

FPGAでCPUを動かすことについて、ISの先輩の記事などから断片的な知識は得られるのですが設計など全く分からない初心者が全体像を把握したいような時に読める記事が無かったので書きました。間違いがあったら指摘してください。
いつになるか分かりませんが一応続くつもりです。

今日の話は、物理的に必要なもの(購入が必要なもの)と漠然とした設計の話です。

とりあえず、必要なもの

FPGAスーパーキット(これがないと始まらない)

・ MAX10-FB基板用の追加部品
   ・発振器
   ・ピンヘッダ2*40
   ・ピンヘッダ1*40
   ・ピンソケット1*40
   ・ピンソケット2*20
   ・ジャンパピン
   ・SDRAM(オプション)
・MAX10-JB基板用の追加部品
   ・PICマイコン
   ・レギュレータ
   ・LED緑
   ・LED黄
   ・ポリスイッチ
   ・水晶発振子
   ・抵抗の中から120,130,10k,10k,2,2kΩ
   ・電解コンデンサ*2
   ・積層コンデンサ0.1μF
   ・積層コンデンサ22pF
   ・USBコネクタ

環境構築

スーパーキットの本に従って、基盤の組み立てとQuartusの導入、FPGAでLチカくらいまでしましょう。(所要時間10時間)
良ければこの記事を参考にして下さい。

設計の雰囲気

お手本にするアーキテクチャMC6800で、一応先行研究としてこんなブログを発見したが、途中で途切れているのでネタの被りはなかったことにします。この記事だって途中で途切れるかもしれないし。MC6800にしたのは8bitCPUが作りたいとハードウェアの先生に相談したところ、おすすめされたため。

具体的な話は今度にして、とりあえず何を作って何を作らないかを明確にする。

イメージ的にはこんな感じ。RAMとROMはQuartusのwizardという機能でサクッと作れるので、実際にHDLを書くのはcontrolerとALUになる。
f:id:yamaguchi_1024:20161215054318p:plain

現在CPUのモードを3つ考えている。
1.ラズパイのGPIOから信号を受け取りRAMの開始番地から書き込む
2.RAMから命令をfetchし、実行する
3.実行結果をラズパイに送る
1,3は外部と通信するとそれっぽいかなというだけで、本質的には2が重要である。

1のイメージ図
ラズパイのGPIOからの通信をFPGAの外部ピンで受信し、I/O controlerを介して命令がRAMに書き込まれる。
f:id:yamaguchi_1024:20161215222101p:plain


2のイメージ図
RAMから命令がfetchされ、Decodeされてexecuteされるよ、という図。
f:id:yamaguchi_1024:20161215221706p:plain


今回はここまで。
次回はタイムチャートとブロック構成と入出力を決めたい。

32bitCPUでpkcrackを動かす話

この記事は、TSG Advent Calendar 2016 - AdventarIS17er Advent Calendar 2016 - Adventarの7日目の記事として書かれました。

駒場祭でpkcrack問を出すために、ARMでpkcrackを動かさねばならず、そのままではセグフォしたので知見を共有します。
ラズパイ2までなど、32bitのアーキテクチャで動かす必要があるときに読んで下さい。

結論から言うと

pkcrack-1.2.2/src/exfunc.cの150行目を、以下のように書き換えてからmake -Bして下さい。

`--> diff before_exfunc.c after_exfunc.c -u
--- before_exfunc.c	2016-12-07 16:06:08.297691503 +0900
+++ after_exfunc.c	2016-12-07 16:05:59.269691329 +0900
@@ -147,7 +147,8 @@
   }
   else;
 
-  data = malloc( lh.csize );
+  data = malloc( lh.csize + 100);
+  data += 100;
 
   if(!data)
   {

美しくない解決法であることは事実です・・・。が、元々のソースコードmallocのチャンクを破壊してたりfreeしてなかったりとなかなか美しくないので、許して下さい。


原因を深堀してみる

上記の書き換えを行わないと、こんなエラーが出ます。

`--> ~/tools/pkcrack-1.2.2/src/pkcrack -p buho310.pdf -P buho.zip -C easy_3.zip -c buho310.pdf -d dec.zip
Files read. Starting stage 1 on Wed Dec  7 13:42:07 2016
Generating 1st generation of possible key2_633361 values...done.
Found 4194304 possible key2-values.
Now we're trying to reduce these...
Lowest number: 974 values at offset 629645
Lowest number: 929 values at offset 629483
Lowest number: 914 values at offset 629400
Lowest number: 872 values at offset 629227
Lowest number: 845 values at offset 629213
Lowest number: 818 values at offset 629211
Lowest number: 817 values at offset 629151
Lowest number: 763 values at offset 629138
Lowest number: 699 values at offset 629111
Lowest number: 690 values at offset 629106
Lowest number: 684 values at offset 623608
Lowest number: 671 values at offset 623577
Lowest number: 640 values at offset 623571
Lowest number: 630 values at offset 623567
Lowest number: 628 values at offset 623556
Lowest number: 608 values at offset 623547
Lowest number: 549 values at offset 623529
Lowest number: 519 values at offset 623524
Lowest number: 497 values at offset 623517
Lowest number: 452 values at offset 623515
Lowest number: 447 values at offset 623514
Lowest number: 441 values at offset 623513
Lowest number: 425 values at offset 623507
Lowest number: 413 values at offset 623505
Lowest number: 401 values at offset 623481
Lowest number: 384 values at offset 623480
Lowest number: 378 values at offset 623353
Lowest number: 374 values at offset 623271
Lowest number: 371 values at offset 623258
Lowest number: 361 values at offset 623257
Lowest number: 355 values at offset 623222
Lowest number: 340 values at offset 623181
Lowest number: 325 values at offset 623173
Lowest number: 314 values at offset 623172
Lowest number: 310 values at offset 623171
Lowest number: 307 values at offset 623168
Lowest number: 285 values at offset 623167
Lowest number: 268 values at offset 600883
Lowest number: 252 values at offset 600869
Lowest number: 245 values at offset 600867
Lowest number: 222 values at offset 600866
Lowest number: 221 values at offset 600845
Lowest number: 216 values at offset 600829
Lowest number: 206 values at offset 567363
Lowest number: 199 values at offset 567362
Lowest number: 186 values at offset 567338
Lowest number: 178 values at offset 567271
Lowest number: 172 values at offset 567270
Lowest number: 171 values at offset 567269
Lowest number: 164 values at offset 567267
Lowest number: 154 values at offset 567266
Lowest number: 150 values at offset 567263
Lowest number: 149 values at offset 567259
Lowest number: 144 values at offset 567257
Lowest number: 138 values at offset 567256
Lowest number: 137 values at offset 567244
Lowest number: 133 values at offset 567243
Lowest number: 114 values at offset 567185
Lowest number: 113 values at offset 567130
Lowest number: 100 values at offset 567121
Done. Left with 100 possible Values. bestOffset is 567121.
Stage 1 completed. Starting stage 2 on Wed Dec  7 13:44:25 2016
zsh: segmentation fault (core dumped)  ~/tools/pkcrack-1.2.2/src/pkcrack -p buho310.pdf -P buho.zip -C easy_3.zip -c

gdbで実行しながらデバッグしていると、以下のことがわかります。
1.main.c(下記)の231行目でextractの戻り値をplaintextに代入して、235行目でextractの戻り値からoffsetを引いている(!)このextraxt関数の中身がexfunc.c。

231     plaintext = extract( pFromZIP, plainname, caseflg );
232     if( !plaintext )
233         exit(1);
234     plainlength = lh.csize;
235     plaintext -= offset;                                                        
236     }

2.gdbで見てみると、offsetの中身は0xc。
3.plaintext[0]~plaintext[3]にアクセスしようとするとできない。(4以降はできる!)
4.extractの返り値はmalloc( lh.csize );

32bitだとmalloc chunkがprev_sizeの4byte+sizeの4byteで8byteしかないので、12byte引くとダメなのかなと思い、上記のように修正したら治りました。
64bitだとmalloc chunkが16byteなので、12byte引いても問題なかったと考えられます。plaintext[0]~plaintext[3]にアクセスできなかったことからも、妥当かなと思います。

malloc chunkの実装を置いておきます。

1104 struct malloc_chunk {
1105 
1106   INTERNAL_SIZE_T      prev_size;  /* Size of previous chunk (if free).  */
1107   INTERNAL_SIZE_T      size;       /* Size in bytes, including overhead. */
1108 
1109   struct malloc_chunk* fd;         /* double links -- used only if free. */
1110   struct malloc_chunk* bk;
1111 
1112   /* Only used for large blocks: pointer to next larger size.  */
1113   struct malloc_chunk* fd_nextsize; /* double links -- used only if free. */
1114   struct malloc_chunk* bk_nextsize;
1115 };
1116 
1117 
1118 /*
1119    malloc_chunk details:
1120 
1121     (The following includes lightly edited explanations by Colin Plumb.)
1122 
1123     Chunks of memory are maintained using a `boundary tag' method as
1124     described in e.g., Knuth or Standish.  (See the paper by Paul
1125     Wilson ftp://ftp.cs.utexas.edu/pub/garbage/allocsrv.ps for a
1126     survey of such techniques.)  Sizes of free chunks are stored both
1127     in the front of each chunk and at the end.  This makes
1128     consolidating fragmented chunks into bigger chunks very fast.  The
1129     size fields also hold bits representing whether chunks are free or
1130     in use.
1131 
1132     An allocated chunk looks like this:
1133 
1134 
1135     chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1136         |             Size of previous chunk, if allocated            | |
1137         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1138         |             Size of chunk, in bytes                       |M|P|
1139       mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1140         |             User data starts here...                          .
1141         .                                                               .
1142         .             (malloc_usable_size() bytes)                      .
1143         .                                                               |
1144 nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1145         |             Size of chunk                                     |
1146         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1147 
1148 
1149     Where "chunk" is the front of the chunk for the purpose of most of
1150     the malloc code, but "mem" is the pointer that is returned to the
1151     user.  "Nextchunk" is the beginning of the next contiguous chunk.
1152 
1153     Chunks always begin on even word boundaries, so the mem portion
1154     (which is returned to the user) is also on an even word boundary, and
1155     thus at least double-word aligned.
1156 
1157     Free chunks are stored in circular doubly-linked lists, and look like this:
1158 
1159     chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1160         |             Size of previous chunk                            |
1161         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1162     `head:' |             Size of chunk, in bytes                         |P|
1163       mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1164         |             Forward pointer to next chunk in list             |
1165         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1166         |             Back pointer to previous chunk in list            |
1167         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1168         |             Unused space (may be 0 bytes long)                .
1169         .                                                               .
1170         .                                                               |
1171 nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1172     `foot:' |             Size of chunk, in bytes                           |
1173         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1174 
1175     The P (PREV_INUSE) bit, stored in the unused low-order bit of the
1176     chunk size (which is always a multiple of two words), is an in-use
1177     bit for the *previous* chunk.  If that bit is *clear*, then the
1178     word before the current chunk size contains the previous chunk
1179     size, and can be used to find the front of the previous chunk.
1180     The very first chunk allocated always has this bit set,
1181     preventing access to non-existent (or non-owned) memory. If
1182     prev_inuse is set for any given chunk, then you CANNOT determine
1183     the size of the previous chunk, and might even get a memory
1184     addressing fault when trying to do so.
1185 
1186     Note that the `foot' of the current chunk is actually represented
1187     as the prev_size of the NEXT chunk. This makes it easier to
1188     deal with alignments etc but can be very confusing when trying
1189     to extend or adapt this code.
1190 
1191     The two exceptions to all this are
1192 
1193      1. The special chunk `top' doesn't bother using the
1194     trailing size field since there is no next contiguous chunk
1195     that would have to index off it. After initialization, `top'
1196     is forced to always exist.  If it would become less than
1197     MINSIZE bytes long, it is replenished.
1198 
1199      2. Chunks allocated via mmap, which have the second-lowest-order
1200     bit M (IS_MMAPPED) set in their size fields.  Because they are
1201     allocated one-by-one, each must contain its own trailing size field.
1202 
1203 */


感想

楽しかったです(白目)
コメントお待ちしております。

FPGA動かすまでに苦労したことまとめ & ボード買わなくてもFPGAをラズパイのGPIOと接続する方法[学科の人向け]

作ったもの FPGA

この記事は、IS17er Advent Calendar 2016 - Adventarの6日目の記事として書かれました。
IS17erで、小林先生にFPGAもらったけどまだ作ってない人向けの記事です。FPGAスーパーキットの本を持っている読者を想定してます。
これから組み立てる人がスムーズに行くように困ったところを書いていきます。


私のFPGA現在の状況。Lチカと、ラズパイのGPIOから10送ってxorした結果が出力されている図です。
youtu.be
f:id:yamaguchi_1024:20161206210822j:plain


組み立て

レギュレータなど、小林先生にもらった部品は本に書いてある通りの部品ではないのでいい感じに取り付けることが必要です。

全体像
f:id:yamaguchi_1024:20161206212229j:plain
f:id:yamaguchi_1024:20161206212253j:plain

取り付けは、部品さえあれば本の64ページ辺りと76ページ辺りを読めば普通にできます。

抵抗は下記のように取り付けます。
・130ΩのR2の代わりに150Ω(茶緑茶金)
・120ΩのR1の代わりに100Ω(茶黒茶金)
・10kΩのR3,R4は茶黒橙なのでそのままでよい
・2.2kΩのR5も赤赤赤でそのままでよい

レギュレータは、上記のMAX10-JB基盤の写真の右下にe3と書かれたピンが来るように取り付けます。
はんだ付けの先生にやってもらったとき、先生は基盤に付いているはんだを取ってから自分でつけていました。

SRAMPICマイコンにプログラムを書き込む前に付けても特に問題はありませんでした。ロボテクの人ならSRAMのはんだ付けできるみたいなので、頼んでみるといいかもしれません。

QuartusにFPGAを認識させる

完全に苦労しました。
私の環境(windows10,insider buildが有効になっている(関係あるのか?))で最初に出たエラーです。
f:id:yamaguchi_1024:20161206212757p:plain
f:id:yamaguchi_1024:20161206212804p:plain
f:id:yamaguchi_1024:20161206212811p:plain
f:id:yamaguchi_1024:20161206212817p:plain

結論から言うと、デバイスドライバがちゃんとインストールできていなかったのが問題のようでした。
色々なことを試しましたが、エラーが起きたらすぐドライバをアンインストールして、もう一度インストールするというのを下記のようにやればすぐ直ったんじゃないかと思います。
1.デバイスマネージャーを起動する。
2.USB-Blasterの項目にエラーが出ている。
3.Altera-USB-Blasterの項目にエラーが出ている。 はい→4へ いいえ→おわり。
4.Altera-USB-Blasterを右クリックして、uninstall driverを選び、アンインストールします。
5.USB-Blasterを右クリックして、Update driver→Manually install driverとして、search for drivers in the locationの欄にC:\altera_lite\15.1\quartus\drivers\usb-blasterと書きます。次へを押して、インストールします。
6.エラーは消えましたか? はい→おわり。 いいえ→1へ戻って無限回繰り返す。


ためして、そして無駄だったこと。

デバイスドライバインストールしてみたけどダメ
コントロールパネルのデバイス管理のところで、表示されない。
quartusをアンインストールして、最新版16.1をインストール。
quartus prime standalone programmerをインストールしたけどだめ。
quartus prime 最新版 ダメ。
serviceからAltera JTAG server何回も再起動したけど関係なさそう。
quartus programmerでAdd hardwareとか色々いじったけど全く関係なかった。ドライバの問題だった。
デバイスドライバを何回も何回も再インストールして、これやったら直った。


ボード買わなくてもラズパイのGPIOと接続する方法

ブレッドボードと青いメスオスの線、又はメスメスの線は最低限必要です。
53ページを見ます。
組み立ての最後の方にCN1,CN2を付けますが、それが外部に接続するためのピンたちで、53ページの外部コネクタの欄にも書いてありますし、基盤にもピン番号(P6とかP62とか)が書いてあります。
FPGAのピンと付けたいラズパイのピンを物理的に接続します。私はFPGAのP59,P60,P61,P62とラズパイ端子の29,31,33,35をこの順でつけました。ラズパイはGPIOの番号と端子の番号は違うので気を付けてください。
本の112p辺りを見ながら、プロジェクトを作っていきます。
書いたverilogはこんな感じ。

module FPGA (
	input wire IN_A,
	input wire IN_B,
	output wire O
	);
	
	wire IA;
	wire IB;
	
	assign IA = IN_A & ~IN_B;
	assign IB = ~IN_A & IN_B;
	
	assign O = IA | IB;
	
endmodule

これを保存し、Assignments→PinPlannerで先ほどのP60とかP62にピンを割り当てていきます。
こんな感じ。
f:id:yamaguchi_1024:20161206215409p:plain

FPGAに書き込んで、ラズパイで適当に端子の31と33からHIGH,LOWを出力して35からINPUTして出力、みたいなスクリプトpythonで書けばおわりです!
XORするだけの超もったいないFPGAの使い方ができます。



コメントいただけると嬉しいです。

TSGCTFwriteup

CTF 作ったもの

この記事は、TSG Advent Calendar 2016 - AdventarIS17er Advent Calendar 2016 - AdventarCTF Advent Calendar 2016 - Adventarの5日目の記事として書かれました。


駒場祭でTSGの展示の一環として、TSGCTF(オフラインのセキュリティコンテスト的なもの)を開催しました。
問題やスコアサーバともに部員の手作りで、問題は基本的に毎週金曜に開催しているCTF分科会で出されたものをまとめて出しました。

会場の様子はこんな感じ。(TSGが開発しているゲームMNEMO プログラミング風パズルゲームをプレイしているひとが多いので、全員がCTFやっているわけではありません。)

f:id:yamaguchi_1024:20161205022200p:plain

私が作った問題のwriteupを書いていこうと思います。


SQL[PPC?]

問題

<stage1>
count 1 to 100 in sqlite3! (length limit 80 words)
insert nor creat query is prohibited.

<Stage2>
Output sequence below in ONE line.
2,3,7,23,59,314,1529,8209,83313,620297,7869898,126742987,1687054711,47301104551,1123424582771,32606721084786.0,1.66231521597106e+15,6.19580465542266e+16,4.25799888444834e+18,3.34806306946199e+20,2.33857567318697e+22,3.4163728687278e+24,3.97068399296019e+26,6.25954414096408e+28,1.58862800856536e+31,2.99327078237057e+33,1.10746410850255e+36,4.24202695773047e+38,1.57131202095317e+41
(length limit 140)

<stage3>
Output this!
#...............................................................
##..............................................................
#.#.............................................................
####............................................................
#...#...........................................................
##..##..........................................................
#.#.#.#.........................................................
########........................................................
#.......#.......................................................
##......##......................................................
#.#.....#.#.....................................................
####....####....................................................
#...#...#...#...................................................
##..##..##..##..................................................
#.#.#.#.#.#.#.#.................................................
################................................................
#...............#...............................................
##..............##..............................................
#.#.............#.#.............................................
####............####............................................
#...#...........#...#...........................................
##..##..........##..##..........................................
#.#.#.#.........#.#.#.#.........................................
########........########........................................
#.......#.......#.......#.......................................
##......##......##......##......................................
#.#.....#.#.....#.#.....#.#.....................................
####....####....####....####....................................
#...#...#...#...#...#...#...#...................................
##..##..##..##..##..##..##..##..................................
#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.................................
################################................................
#...............................#...............................
##..............................##..............................
#.#.............................#.#.............................
####............................####............................
#...#...........................#...#...........................
##..##..........................##..##..........................
#.#.#.#.........................#.#.#.#.........................
########........................########........................
#.......#.......................#.......#.......................
##......##......................##......##......................
#.#.....#.#.....................#.#.....#.#.....................
####....####....................####....####....................
#...#...#...#...................#...#...#...#...................
##..##..##..##..................##..##..##..##..................
#.#.#.#.#.#.#.#.................#.#.#.#.#.#.#.#.................
################................################................
#...............#...............#...............#...............
##..............##..............##..............##..............
#.#.............#.#.............#.#.............#.#.............
####............####............####............####............
#...#...........#...#...........#...#...........#...#...........
##..##..........##..##..........##..##..........##..##..........
#.#.#.#.........#.#.#.#.........#.#.#.#.........#.#.#.#.........
########........########........########........########........
#.......#.......#.......#.......#.......#.......#.......#.......
##......##......##......##......##......##......##......##......
#.#.....#.#.....#.#.....#.#.....#.#.....#.#.....#.#.....#.#.....
####....####....####....####....####....####....####....####....
#...#...#...#...#...#...#...#...#...#...#...#...#...#...#...#...
##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..
#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.
################################################################

stage1からstage3まであります。
sqlite3で再帰をしようという問題です。sqlite3.8.3以降にはWITH句という再帰ができる構文があり、これを使うことを想定しています。この問題は、結局部員にしか解いてもらえませんでした…。

sqlite3 withと検索すると公式ページSQLite Query Language: WITH clauseが出てくるので、これを読みながらやります。

stage1の解答は、普通にやると

with recursive c(x) as (select 1 union select x+1 from c limit 100) select x from c;

となってしまい、これでは80文字以内に収まりません。
しかし、公式ページの一番下に

The SQL:1999 spec requires that the RECURSIVE keyword follow WITH in any WITH clause that includes a recursive common table expression. However, for compatibility with SqlServer and Oracle, SQLite does not enforce this rule.

と書いてあるので、実はrecursiveはいらないことが分かります。
よって、解答は

with c(x) as (select 1 union select x+1 from c limit 100) select x from c;


stage2は数列を検索するとソモスの数列だということが分かります。
あとは漸化式に従って実装して、カンマ区切りで出力するという制約があるのでgroup_concatを用います。

with somos(a,b,c,d)as(select 1,1,1,1 union select (a*c+b*b)/d,a,b,c from somos limit 30)select group_concat(a,',') from somos where a>1;

ちなみに、stage2は本当はフィボナッチ数列にしようと思ってたのですが同じようなことをやっているサイトが見つかって没になりました。
フィボナッチ数列

WITH f(a,b)AS(SELECT 1, 0 union select a+b, a from f limit 90)SELECT a FROM f;

stage3はシェルピンスキーのキャスケットを出力する問題です。
この問題は想定解を作ってなくて(おい)部員の@satosと@nolzeさんの秀逸な解答を載せます。
@satos

with 
f(a) as (select 0 union select a+1 from f limit 4),
m(k,w, y, x, c) as (
  select 0,1,0,0,2
  union
  select k+1,w*2,y+(a/2)*w,x+(a%2)*w,1+(c-1)*(a!=1) from m,f
  where k<6),
s(t) as (
  select group_concat(substr('.#',c,1),'')
  from (select x,y,k,c from m order by x) where k=6 group by y 
)
select t from s;

@nolze

WITH t(n,b1,b2,b3,b4) AS (SELECT 0,0x1000000000000000,0,0,0 UNION SELECT 
n+1,
(~((b1>>0x4)&b1))&((b1>>0x4)|b1),
(~((((b1&0x1)<<0x3c)|(b2>>0x4))&b2))&((((b1&0x1)<<0x3c)|(b2>>0x4))|b2),
(~((((b2&0x1)<<0x3c)|(b3>>0x4))&b3))&((((b2&0x1)<<0x3c)|(b3>>0x4))|b3),
(~((((b3&0x1)<<0x3c)|(b4>>0x4))&b4))&((((b3&0x1)<<0x3c)|(b4>>0x4))|b4) 
FROM t LIMIT 64) SELECT 
replace(replace(printf("%-016x%-016x%-016x%-016x",b1,b2,b3,b4),'0','.'),'1','#') 
FROM t;

@satosのは上から小さな三角形を作ってそれを下と右下にコピーして…みたいなことをやっていて、@nolzeさんのはセルオートマトンが大好きなのでルール90をエミュレートしています。


Are you smart??[misc]

問題
You can solve this problem even if you are NOT smart!!

Are_you_smart.pcapng - Google ドライブ


こんな感じの問題ファイルが与えられます。
f:id:yamaguchi_1024:20161204164620p:plain

これはスマホをパソコンに繋いで写真を転送した時のパケットキャプチャなのでプロトコルがUSBです。
5個しかパケットがなくて、3つめのパケットがやけにサイズが大きいことが分かります。
なんのパケットかな~と思って2つめのパケットを見ると、JFIFという文字があり、ここからjpegということが分かります。

データ部分をtsharkで抜き出します。

tshark -r Are_you_smart.pcapng -T fields -e usb.capdata > data

こんな感じになります。
f:id:yamaguchi_1024:20161205025559p:plain

普通のjpeg画像のヘッダ部分と見比べて、ちゃんとしたヘッダになるように2つめのパケットの先頭部分を削除して、3つめのパケットとバイナリとしてつなげようと思います。jpeg画像はff:d8..から始まっているのでそこまで削除して、一行にするとこのようになります。

f:id:yamaguchi_1024:20161205025606p:plain

これをjpegファイルにします。

`--> irb
irb(main):001:0> a=`cat data`.split(":").map{|x| x.hex}.pack("C*");nil
=> nil
irb(main):002:0> f=File.open("output","wb")
=> #<File:o>
irb(main):003:0> f.write(a)
=> 52724


outputを開くとフラグが見えます。
f:id:yamaguchi_1024:20161205025747j:plain

HHKB!![networking]

問題

I had borrowed HHKB!! from my boyfiend :)
HHKB!!.pcapng - Google ドライブ

こんな感じのファイルが与えられます。
f:id:yamaguchi_1024:20161204170424p:plain

またもやUSBプロトコルです。
パケットをパタパタ見てみると、28パケット目あたりがパタパタ変わっていることが分かります。
タイトルのHHKBから、これはUSBキーボードとの通信なのかなと思います。
USB keyboard CTF..などとググっていると、TDUCTFの記事が出てきて、その中で言及されているUSB usage tableにたどり着きます。
53ページ目から、keyboard/keycode pageが始まり、"keycodes used in implementing a usb keyboard"の長い表があります。
データの0バイト目が02の時はシフトが押された状態で、2バイト目が2Aだとバックスペースだということに注意をして読んでいくと、入力された文字列はTSG{cookies}だということが分かります。


他にもeasyな問題たちを5個作りました。会場にはパソコン触ったことが無いような人も来るので、楽しめるようにと作りましたが意味わからんという反応が多かったです。。
一応やったことない人でもできるように解説も書いて、Githubにあるので暇な人は見てください。
簡単ではありますが、ARMなのでリバーシングはなかなか楽しいです。(なぜARMかというと、参加者のPCにラズパイを使ったから)

shellを作っている話(かきかけ)

この記事は、IS17er Advent Calendar 2016 - Adventarの三日目の記事として書かれました。
まだ自分の満足する完成には程遠いので、永遠にかきかけです。

とりあえず、ソースコード
GitHub - yamaguchi1024/shell

概要

大学の課題として、@cookies146と一緒に作っています。役割分担は、私が機能の実装などでcookiesが構成を考えたりライブラリを作ったりです。
サポートしている機能は下記の通り。
・コマンドの実行
・組み込みコマンドの実行
・キーボードからのシグナルハンドル
・リダイレクト
・パイプ
・上矢印を押すと履歴を表示する
・qでシェルを終了できる
・2秒以上時間のかかるファイルを実行した時に、実行してからの経過時間とCPU使用率仮想メモリ使用量、実際のメモリ使用量、最大メモリ使用量が表示される。

いつかはジョブ管理も実装したいなーと思っています。また、CPUとメモリ使用量が表示される機能は使いたいと言ってくれる方がいるので、シェルとは別に切り出して別のコマンドか何かにできたらいいなと思っています。
目標は、自分の作ったCPU上で自分の作ったOSが動きその上で自分の作ったシェルが動きその上で自分の作ったママ言語が動くことです。

特に苦労した(している)上矢印の履歴とCPU・メモリ使用量の機能について語ります。

上矢印

getlineやgetcでstdinからの入力を読み込んだ場合、改行が入力されるまでバッファにたまってしまうので上矢印だけで履歴を表示するためには別の方法を考える必要がありました。
そこでalpha改さんに教えてもらったのがkbhitという関数(below)です。

int kbhit(void)
{
    struct termios oldt, newt;
    int ch; 
    int oldf;

    tcgetattr(STDIN_FILENO, &oldt);
    newt = oldt;
    newt.c_lflag &= ~(ICANON | ECHO);
    tcsetattr(STDIN_FILENO, TCSANOW, &newt);
    oldf = fcntl(STDIN_FILENO, F_GETFL, 0); 
    fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK);

    ch = getchar();

    tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
    fcntl(STDIN_FILENO, F_SETFL, oldf);

    if (ch != EOF) {
        ungetc(ch, stdin);
        return 1;
    }                                                                                                                                                                     

    return 0;
}

キーボードからの入力(というよりはキーボードが押されると)trueが帰ってくるので、これで何かしらの入力があったときに検知することはできます。
上矢印の制御文字は\x1B\x5B\x41なので、getcharして\x1Bなら表示はしないがそれ以外なら普通の入力なのでungetcしてからgetlineするということをしています。なぜわざわざungetcしているかというと、そうしないと最初の一文字だけ見えなくなってしまうからです。

        while(1){
            if(kbhit()){
                c=getchar();
                if(c=='\x1B'){
                    c=getchar();
                    c=getchar();
                    oprand="\x1B\x5b";
                    oprand+=(char)c;
                    break;}
                else{
                    ungetc(c,stdin);
                    printf("%c",c);
                    std::getline(std::cin,oprand);
                    break;
                }
            }       
        }           

また、履歴を保存するファイルが必要なので、入力が上矢印以外だったら.shrcに書き込んで、シェルを閉じるときにunlinkしています。

上矢印が押された時の処理は、基本的には.shrcを開いて下から上矢印を押された分だけ表示するだけですが、上矢印を押すのをやめて\nを押したか、あるいは上矢印を押し続けているかという状態をmain関数に渡すと厄介だったので、\nが押されるまでuparrow関数の中にいます。(長いので貼るのは割愛)


CPU・メモリ使用量の表示どこからこの情報を取ってくるかで悩みました。
結局/proc/[id]/statやstatusから取ってきているのですが、forkした子プロセスのidを元にファイルを探しているので、例えばa.outのなかで別のフプロセスb.outが呼び出された時はどうしようもありません。しかし、topコマンドも/procから読んでるし他にいい方法はなさそうです。

CPU使用率は/proc/[id]/statのutime,stime(14,15列目)を足した値/ /proc/statのCPUの稼働時間を表している一行目の各列を足した値という式で求めていて、メモリ使用量は/proc/[id]/statusのVmPeak,VmSize,VmRSSの行を出力しています。

最も苦労しているのが、親プロセスの中で繰り返し何秒化ごとに処理を実行する中で、子プロセスが死んだことをどのように監視するかです。
普通親プロセスが子プロセスを監視するときにはwaitとかwaitpidを使いますが、waitpidのオプションWNOHANGで子プロセスが終了していない時にもWIFEXITEDが0になるという問題がありダメで、シグナルハンドラを使ってなんとか動くようになりました(エラーは出るけど)

時間やばいのでとりあえず更新します。