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

yamaguchi.txt

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

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

この記事は、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

この記事は、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になるという問題がありダメで、シグナルハンドラを使ってなんとか動くようになりました(エラーは出るけど)

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

brainf*ckでママ言語

12/15日はcookies(通称ママ)のお誕生日なので、brainf*ckパクリのママ言語を作ってみた。(盛大にフライング)

ソースコードを見てください。
github.com

brainf*ckインタプリタを書く

記号を置き換えてママインタプリタを書く

ママ言語、そのまま書くのが辛すぎるのでbrainf*ckをママ言語に変換するプログラムを書く

という順に実装をした。

命令は下記のように割り当てた。

> : "ママーー!\n"
< : "ママーー!!\n"
+ : "ばぶぅ!\n"
- : "ばぶーーー!\n"
. : "マ、マーーー!!\n"
, : "ままああああああ!\n"
[ : "赤ちゃんでしゅ。\n"
] : "赤ちゃんでーーしゅ!\n"

末尾に改行が入っていることから分かる通り、一命令一行である。赤ちゃんは改行が大好き!

"HelloWorld"を出力するママ言語

ばぶぅ!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ばぶぅ!
赤ちゃんでしゅ。
ママーー!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ママーー!!
ばぶーーー!
赤ちゃんでーーしゅ!
ママーー!
マ、マーーー!!
ママーー!!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ばぶぅ!
赤ちゃんでしゅ。
ママーー!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ママーー!!
ばぶーーー!
赤ちゃんでーーしゅ!
ママーー!
ばぶーーー!
マ、マーーー!!
ママーー!!
ばぶぅ!
ばぶぅ!
赤ちゃんでしゅ。
ママーー!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ママーー!!
ばぶーーー!
赤ちゃんでーーしゅ!
ママーー!
ばぶぅ!
マ、マーーー!!
マ、マーーー!!
ばぶぅ!
ばぶぅ!
ばぶぅ!
マ、マーーー!!
ママーー!!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ばぶぅ!
赤ちゃんでしゅ。
ママーー!
ばぶーーー!
ばぶーーー!
ばぶーーー!
ばぶーーー!
ママーー!!
ばぶーーー!
赤ちゃんでーーしゅ!
ママーー!
マ、マーーー!!
ママーー!!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ばぶぅ!
赤ちゃんでしゅ。
ママーー!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ばぶぅ!
ママーー!!
ばぶーーー!
赤ちゃんでーーしゅ!
ママーー!
マ、マーーー!!
ばぶぅ!
ばぶぅ!
ばぶぅ!
マ、マーーー!!
ばぶーーー!
ばぶーーー!
ばぶーーー!
ばぶーーー!
ばぶーーー!
ばぶーーー!
マ、マーーー!!
ばぶーーー!
ばぶーーー!
ばぶーーー!
ばぶーーー!
ばぶーーー!
ばぶーーー!
ばぶーーー!
ばぶーーー!
マ、マーーー!!


感想

githubを見れば分かる通り実装は超簡単なので実装時間は2時間にも満たないが、楽しかった!
これでママーーー!と言っていてもプログラミングをしていると主張できる!

プログラミング言語pike

TSG駒場祭ハッカソンでesolang百マス陣取りゲームをやり、pikeというプログラミング言語を知ったが日本語のレファレンスが少なく、かつ感動したためここにまとめる。

pikeとは?

Cに見た目がよく似たプログラミング言語で、動的型付けも静的型付けも可能
wikipediaを見よう。

インストール

公式サイトからダウンロードしてコンパイルするが、そのままでは動かなかったので、
多倍長ライブラリのGMPを公式サイトからダウンロードし、解凍してインストールする。
またエラーが出るので、Nettleをダウンロードしインストールする。
READMEに従い、rootのディレクトリでmake,make install.
コマンドpikeを打つと対話型で使え、適当な拡張子で(例えばtest.pike)ファイルを作り、pike test.pike などとすると実行される。

型の種類

basic typeはint,float,stringの三種類。(Cと違いcharがなくてハマった)
特殊な型として、mixed型(型はなんでも良いという型)が存在する。
intは同じ78が、
10進数で78
8進数で0116
16進数で0x4e
2進数で0b1001110
1文字の'N'('N'はasciiコードで78)
と表せる。

pikeではintが表せる範囲は非常に大きく、またその範囲を超えた場合にはbignumというintより遅いが大きい型に勝手に変更してくれるので、intしか使う必要がない。

このように動的型付けと静的型付けが混在しているため、変数aがint,float,stringのどれかを確認するためのintp(a),floatp(a),stringp(a)という関数が用意されている。(戻り値はaがint型ならintp(a)==1でそれ以外なら0)

stringは"+"で連結ができるが,
string s = "hogehoge\n"のとき、
s[2]="g"ではなく
s[2]=103
となるので注意。

Zero is special

0は整数値であるだけでなく、すべての型の値がない状態を表し、したがって初期化されずに宣言されたすべての変数は0になる。
公式サイトより↓

float f;  // Now, f contains the integer value 0.
f = f + 1;// Now, f contains the integer value 1.
f = 0;    // Now, f contains the integer value 0 again!
f = 0.0;  // Now, f contains the real value 0.0.

正直気持ち悪いですねー・・・。
したがって、下記のコードの出力は「0Hi!」になります。

int main(){
  string s;
  //s==0!!!
  s += "Hi!\n";
  write(s);
}

配列

こういうのが配列になります
({2,3,4,1})
({"pohe",4,2.1,"hoge!?",334,({1,1,4,"cookie"}) })
宣言は、
array a; 型はなんでも良い
array(string) a; stringのarray
array(mixed) a; 型何でも良い
でできる。

array a = ({2,3,4});
array b = ({3,5,6});
のとき、
a[1]==3
a + b == ({2,3,4,3,5,6})
となります。


Sample

Hello world!

int main(){
  write("Hello world!\n");
}

Fizz Buzz

int main(){
  for(int i=1;i<100;i++){
    if(i%3 == 0 || i%5 == 0){
    if(i%3 == 0) write("Fizz");
    if(i%5 == 0) write("Buzz\n");
    else write("\n");}
    else write("%d\n",i);
    }
}

標準入力で与えられた二進数を十進数に変換して標準出力に出す
(ハッカソンの課題だった)

int main() {
  string s=Stdio.stdin.gets();
   int i=strlen(s);
   int res=0;
   int j=i-1;
   while(j>=0){
     if(s[j]==49){
    	res= res+pow(2,i-j-1);
     }
     j = j-1;
    }
   write("%d\n",res);
   return 0;
}

参考リンク

インストールめんどくさいのでちょっとここで試してみよう。
https://ideone.com/

公式。
http://pike.lysator.liu.se/

感想

pike,気持ち悪すぎて逆に好きになってしまった。
疑問質問まさかりなどがあれば本当にお気軽にどうぞ。

Hack the vote forensic 500 Hillary's Email [writeup]

Problem:

We suspect Hillary has been smuggling her emails over the border using some kind of underground passageway. Find out where she's hiding them and what secrets they contain

We were given pcap file like this.
f:id:yamaguchi_1024:20161107110232p:plain

There were over 40000 packets of DNS protocol,and when we noticed that there were strange string in the query.
f:id:yamaguchi_1024:20161107110620p:plain

In the picture above, blue part is a query of DNS, and you see the strange substring in the prefix of domain name.

vaaaakawdaq.hillary.clinton.io
yrbqyg.hillary.clinton.io

all packets were like this, so we thought that there were information inside.

We used scapy to extract domain name out of DNS query.
Our script was like this:

import scapy
a=rdpcap("hillary.pcap")
for i in range(len(a)):
    if (a[i]["Ether"].src=="192.168.175.150" and len(a[i]["DNSRQ"].qname)!=0) :
        res.append(a[i]["DNSRQ"].qname)

Results:

00000000  79 72 62 71 79 64 76 61  61 61 61 6b 61 77 64 61  |yrbqydvaaaakawda|
00000010  71 6c 61 64 69 78 76 79  70 78 68 35 7a 32 70 76  |qladixvypxh5z2pv|
00000020  78 6d 34 72 73 70 6b 64  31 6a 75 70 73 6d 67 62  |xm4rspkd1jupsmgb|
00000030  69 79 72 62 71 79 67 7a  71 79 68 61 41 2d 41 61  |iyrbqygzqyhaA-Aa|
00000040  61 68 68 68 2d 44 72 69  6e 6b 2d 6d 61 6c 2d 65  |ahhh-Drink-mal-e|
00000050  69 6e 2d 4a e4 67 65 72  6d 65 69 73 74 65 72 2d  |in-J.germeister-|
00000060  7a 71 79 69 61 41 2d 4c  61 2d 66 6c fb 74 65 2d  |zqyiaA-La-fl.te-|
00000070  6e 61 ef 76 65 2d 66 72  61 6e e7 61 69 73 65 2d  |na.ve-fran.aise-|
00000080  65 73 74 2d 72 65 74 69  72 e9 2d e0 2d 43 72 e8  |est-retir.-.-Cr.|
00000090  74 65 7a 71 79 6a 61 41  62 42 63 43 64 44 65 45  |tezqyjaAbBcCdDeE|
000000a0  66 46 67 47 68 48 69 49  6a 4a 6b 4b 6c 4c 6d 4d  |fFgGhHiIjJkKlLmM|
000000b0  6e 4e 6f 4f 70 50 71 51  72 52 73 53 74 54 75 55  |nNoOpPqQrRsStTuU|
000000c0  76 56 77 57 78 58 79 59  7a 5a 7a 71 79 6b 61 41  |vVwWxXyYzZzqykaA|
000000d0  30 31 32 33 34 35 36 37  38 39 bc bd be bf c0 c1  |0123456789......|
000000e0  c2 c3 c4 .....(continue)

Here, we noticed that there are readable string "Drink-mal-ein" so we googled it and hit the write up.
blog.stalkr.net

We noticed that this problem is very similar to the problem we are solving, so we did as they had done.

We used encoder.c(http://stalkr.net/files/hack.lu/2010/9/encoder.c) and uncompress.c(http://stalkr.net/files/hack.lu/2010/9/uncompress.c). When compiling uncompress.c, we had to add compile option like this

gcc uncompress.c -lz

We compiled those two and used the python script below.

# Extract iodine DNS tunnel data
# -- StalkR
from scapy.all import *
from subprocess import Popen,PIPE

input, output = "hillary.pcap", "extracted.pcap"
topdomain = ".hillary.clinton.io."
upstream_encoding = 128
# and no downstream encoding (type NULL)

# see encoder.c
def encoder(base,encode="",decode=""): # base=[32,64,128]
  p = Popen(["./encoder", str(base), "e" if len(encode)>0 else "d"], stdin=PIPE, stdout=PIPE)
  p.stdin.write(encode if len(encode)>0 else decode)
  return p.communicate()[0]

# see uncompress.c
def uncompress(s):
  p = Popen(["./uncompress"], stdin=PIPE, stdout=PIPE)
  p.stdin.write(s)
  if p.wait() == 0:
    return p.communicate()[0]
  else:
    return False

def b32_8to5(a):
  return "abcdefghijklmnopqrstuvwxyz012345".find(a.lower())

def up_header(p):
  return {
    "userid": int(p[0],16),
    "up_seq": (b32_8to5(p[1]) >> 2) & 7,
    "up_frag": ((b32_8to5(p[1]) & 3) << 2) | ((b32_8to5(p[2]) >> 3) & 3),
    "dn_seq": (b32_8to5(p[2]) & 7),
    "dn_frag": b32_8to5(p[3]) >> 1,
    "lastfrag": b32_8to5(p[3]) & 1
  }

def dn_header(p):
  return {
    "compress": ord(p[0]) >> 7,
    "up_seq": (ord(p[0]) >> 4) & 7,
    "up_frag": ord(p[0]) & 15,
    "dn_seq": (ord(p[1]) >> 1) & 15,
    "dn_frag": (ord(p[1]) >> 5) & 7,
    "lastfrag": ord(p[1]) & 1,
  }

# Extract packets from DNS tunnel
# Note: handles fragmentation, but not packet reordering (sequence numbers)
p = rdpcap(input)
dn_pkt, up_pkt = '', ''
datasent = False
E = []
for i in range(len(p)):
  if not p[i].haslayer(DNS):
    continue
  if DNSQR in p[i]:
    if DNSRR in p[i] and len(p[i][DNSRR].rdata)>0: # downstream/server
      d = p[i][DNSRR].rdata
      if datasent: # real data and no longer codec/fragment checks
        dn_pkt += d[2:]
        if dn_header(d)['lastfrag'] and len(dn_pkt)>0:
          u = uncompress(dn_pkt)
          if not u:
            dn_pkt=''
            continue
            raise Exception("Error dn_pkt %i: %r" % (i,dn_pkt))
          E += [IP(u[4:])]
          dn_pkt = ''
    else: # upstream/client
      d = p[i][DNSQR].qname
      if d[0].lower() in "0123456789abcdef":
        datasent = True
        up_pkt += d[5:-len(topdomain)].replace(".","")
        if up_header(d)['lastfrag'] and len(up_pkt)>0:
          u = uncompress(encoder(upstream_encoding,decode=up_pkt))
          if not u:
            raise Exception("Error up_pkt %i: %r" % (i,up_pkt))
          E += [IP(u[4:])]
          up_pkt = ''

wrpcap(output, E)
print "Successfully extracted %i packets into %s" % (len(E), output)

We slightly changed the script from the original one, because otherwise it stopped with Error.

It took over an hour to run this script, then it gave us extracted.pcap(you can download from here:
extracted.pcap - Google ドライブ
)

We run this code:

`--> strings extracted.pcap| grep -3 Welcome | less

and the results were like this:

--
Etrump
Bpassword: V1
^China
^Welcome, trump
<;N@
Q4-7
4;O@
--
.9(6T
>China
n9(6T)
eWelcome, trump
n9(6c)
49(6d
<IJ@
--
bernie
zpassword: 
tH3_h4nDfUl_0n_top
Welcome, bernie
Q4-7
     
     
--
clinton
Cpassword: 
IAmGoingToBeTheNextPresidentAndIWillDestroyTrump
WWelcome, clinton
kNow, to access your emails, enter the SUPER SECRET PASSWORD: 
*uhhh....China?
r+---------------------

From this, you can see that Trump's password is China, bernie's password is tH3_h4nDfUl_0n_top, and clinton's password is IAmGoingToBeTheNextPresidentAndIWillDestroyTrump.(Neither of those were flags)

extracted.pcap looked like this, and we noticed that it had access with 45.55.178.70.
f:id:yamaguchi_1024:20161107114628p:plain

so we accessed 45.55.178.70 as well.

--> nc 45.55.178.79 9999                          
██╗    ██╗███████╗██╗      ██████╗ ██████╗ ███╗   ███╗███████╗    ████████╗ ██████╗     ██╗  ██╗██╗██╗     ██╗      █████╗ ██████╗ ██╗   ██╗███████╗
██║    ██║██╔════╝██║     ██╔════╝██╔═══██╗████╗ ████║██╔════╝    ╚══██╔══╝██╔═══██╗    ██║  ██║██║██║     ██║     ██╔══██╗██╔══██╗╚██╗ ██╔╝██╔════╝
██║ █╗ ██║█████╗  ██║     ██║     ██║   ██║██╔████╔██║█████╗         ██║   ██║   ██║    ███████║██║██║     ██║     ███████║██████╔╝ ╚████╔╝ ███████╗
██║███╗██║██╔══╝  ██║     ██║     ██║   ██║██║╚██╔╝██║██╔══╝         ██║   ██║   ██║    ██╔══██║██║██║     ██║     ██╔══██║██╔══██╗  ╚██╔╝  ╚════██║
╚███╔███╔╝███████╗███████╗╚██████╗╚██████╔╝██║ ╚═╝ ██║███████╗       ██║   ╚██████╔╝    ██║  ██║██║███████╗███████╗██║  ██║██║  ██║   ██║   ███████║
 ╚══╝╚══╝ ╚══════╝╚══════╝ ╚═════╝ ╚═════╝ ╚═╝     ╚═╝╚══════╝       ╚═╝    ╚═════╝     ╚═╝  ╚═╝╚═╝╚══════╝╚══════╝╚═╝  ╚═╝╚═╝  ╚═╝   ╚═╝   ╚══════╝
   _                                                       _                                                       _                                
  (_)                                                     (_)                                                     (_)                               
 <___>                                                   <___>                                                   <___>                              
  | |______                                               | |______                                               | |______                         
  | |* * * )                                              | |* * * )                                              | |* * * )                        
  | | * * (_________                                      | | * * (_________                                      | | * * (_________                
  | |* * * |* *|####)                                     | |* * * |* *|####)                                     | |* * * |* *|####)               
  | | * * *| * |   (________________                      | | * * *| * |   (________________                      | | * * *| * |   (________________
  | |* * * |* *|####|##############|                      | |* * * |* *|####|##############|                      | |* * * |* *|####|##############|
  | | * * *| * |    |              |                      | | * * *| * |    |              |                      | | * * *| * |    |              |
  | |* * * |* *|####|##############|                      | |* * * |* *|####|##############|                      | |* * * |* *|####|##############|
  | |~~~~~~| * |    |              |                      | |~~~~~~| * |    |              |                      | |~~~~~~| * |    |              |
  | |######|* *|####|##############|                      | |######|* *|####|##############|                      | |######|* *|####|##############|
  | |      |~~~'    |              |                      | |      |~~~'    |              |                      | |      |~~~'    |              |
  | |######|########|##############|                      | |######|########|##############|                      | |######|########|##############|
  | |      |        |              |                      | |      |        |              |                      | |      |        |              |
  | |######|########|##############|                      | |######|########|##############|                      | |######|########|##############|
  | |~~~~~~|        |              |                      | |~~~~~~|        |              |                      | |~~~~~~|        |              |
  | |      |########|##############|                      | |      |########|##############|                      | |      |########|##############|
  | |      '~~~~~~~~|              |                      | |      '~~~~~~~~|              |                      | |      '~~~~~~~~|              |
  | |               |##############|                      | |               |##############|                      | |               |##############|
  | |               '~~~~~~~~~~~~~~~                      | |               '~~~~~~~~~~~~~~~                      | |               '~~~~~~~~~~~~~~~
  | |                                                     | |                                                     | |                               
  | |                                                     | |                                                     | |                               
  | |                                                     | |                                                     | |                               
                                                                                                                                                    
██████╗ ██████╗ ██╗██╗   ██╗ █████╗ ████████╗███████╗    ███████╗███╗   ███╗ █████╗ ██╗██╗         ███████╗███████╗██████╗ ██╗   ██╗███████╗██████╗ 
██╔══██╗██╔══██╗██║██║   ██║██╔══██╗╚══██╔══╝██╔════╝    ██╔════╝████╗ ████║██╔══██╗██║██║         ██╔════╝██╔════╝██╔══██╗██║   ██║██╔════╝██╔══██╗
██████╔╝██████╔╝██║██║   ██║███████║   ██║   █████╗      █████╗  ██╔████╔██║███████║██║██║         ███████╗█████╗  ██████╔╝██║   ██║█████╗  ██████╔╝
██╔═══╝ ██╔══██╗██║╚██╗ ██╔╝██╔══██║   ██║   ██╔══╝      ██╔══╝  ██║╚██╔╝██║██╔══██║██║██║         ╚════██║██╔══╝  ██╔══██╗╚██╗ ██╔╝██╔══╝  ██╔══██╗
██║     ██║  ██║██║ ╚████╔╝ ██║  ██║   ██║   ███████╗    ███████╗██║ ╚═╝ ██║██║  ██║██║███████╗    ███████║███████╗██║  ██║ ╚████╔╝ ███████╗██║  ██║
╚═╝     ╚═╝  ╚═╝╚═╝  ╚═══╝  ╚═╝  ╚═╝   ╚═╝   ╚══════╝    ╚══════╝╚═╝     ╚═╝╚═╝  ╚═╝╚═╝╚══════╝    ╚══════╝╚══════╝╚═╝  ╚═╝  ╚═══╝  ╚══════╝╚═╝  ╚═╝

+-----------------------------+
|       !!! WARNING !!!       |
| SYSTEM HAS BEEN LOCKED DOWN |
|     NON-ADMIN USERS ARE     |
|        NOW  DISABLED        |
+-----------------------------+

login: 

BINGO!!
We logged in with user:clinton pass:IAmGoingToBeTheNextPresidentAndIWillDestroyTrump, and we got 400MB of email dump.
(You can download email dump from here:dump - Google ドライブ)

We changed extension to .pst , and opened it with Outlook.
After a long time staring at email, we noticed the year of the email were strange....
f:id:yamaguchi_1024:20161107115347p:plain

For example if the date was 2095/03/10, we saw 95 as decimal and converted into ascii string and...
f:id:yamaguchi_1024:20161107115625p:plain

Finally got the FLAG!!!!

EKOPARTY CTF 2016 参加記

今回は、wasamusumeというチームで出ました。メンバーはゆったん、三村さん、新穂さん、cookiesなど。
最終得点は1650点で47位、日本では3位かな?
私の解いた問題の得点の合計はたぶん400なので、貢献度1/4という感じでまぁまずまずの結果です。
cookiesの得点が725でほぼ半分で、凄すぎるんだよなぁ…。

[MISC 250] Old but gold

とても頑張りました。気合問でした。
f:id:yamaguchi_1024:20161030031629p:plain

こんな感じの画像が14枚与えられます。

問題文にThese QR codes look weirdと書いてあったので、QRcode???と思ってみてみるも違いそうで。
google画像検索してみたら、パンチカードというキーワードがゲットできたので、punchcard decryptなどとぐぐる
KLOTH.NET - Card punch emulator
punchcard emulatorなるサイトに行き当たり、問題の画像はこのemulatorを使っていることがわかりました。

あとは、なんて書いてあるか読むだけです!!
上記のリンクを用いて、パンチカードの穴の開け方とどの文字が対応しているのかを調べて、あとは本当に頑張って問題のパンチカードを読み取ります。
f:id:yamaguchi_1024:20161030032041p:plain

たぶん合計で5時間くらいは掛かりました。最初は、一文字一文字対応表と見比べて読んでいましたが、半分くらい終わると慣れて、対応表を見なくてもパンチカードが読めるようになりましたが、このスキルはいったい何の役に立つんだろう…。とか考えてとても楽しかったです。
英語なので、文脈と語の最初の文字から単語が推測できる程度の英語力は非常に役に立ちました。

一枚目のパンチカードから、14枚目のパンチカードまで、書いてあることを順に並べると下記のようになります。

of time punching those nards, can you imagine what could
the bug, but those wer3 the old days. can you find the flag
using this old technology? good luck, you will need it )
it was the sixties, he was trykng to figure out how to
manuals try1ng to learn how to program and spend a lot
happen if you fake a small mistake in on of those punched
use those ponched cards, he likes to program in fortran
error due to a small and almost insignificant mist4ke but
and cobol, b(t even after all those years he doesnt know
cards? after those hours waiting ror a result, then it says
in those days your only option w4s read large book and
how to properly mrite secure code in those languages
that will take more time to mebug and figure out where was
once upon a teme, there was a young hacker called mj

英文として、まったく意味が通じないので、意味がある英文に並べ替えました。

once upon a teme, there was a young hacker called mj
it was the sixties, he was trykng to figure out how to
use those ponched cards, he likes to program in fortran
and cobol, b(t even after all those years he doesnt know
how to properly mrite secure code in those languages
in those days your only option w4s read large book and 
manuals try1ng to learn how to program and spend a lot 
of time punching those nards, can you imagine what could
happen if you fake a small mistake in on of those punched
cards? after those hours waiting ror a result, then it says
error due to a small and almost insignificant mist4ke but 
that will take more time to mebug and figure out where was 
the bug, but those wer3 the old days. can you find the flag
using this old technology? good luck, you will need it)

昔は大変だったんですねー…。という英文です。英文を並べ替える段階で、受験英語が初めて役に立った感じがして最高でした。

それぞれの行から、スペルミスしているアルファベットを抜き出すと、
EKO(M41NFR4M3)
小かっこを中かっこに直したら、フラグが通りました。


[forensic 75]Damaged

やるだけ問でした…。
ビットマップイメージが与えられるので、ビットマップイメージをjpegに変換するツールhttps://convertio.co/ja/bmp-jpg/に通すだけでした。

f:id:yamaguchi_1024:20161030033148j:plain


[misc 50]Hidden inside EKO


開発者ツールでbackground.pngとかいうのを見てみると、左上にそのままflagがありました。
f:id:yamaguchi_1024:20161030033318p:plain

[rev 25]JVM

デコンパイルするだけだった。


感想

毎回、miscばっかり解いている気がする。
雑魚問はプロがなぎ倒してくれるので、私は忍耐力しか必要でない高得点misc問に集中した方がいいのかなぁと思ったが、去年のsecconでそれをやって爆死したので怖さがある。
楽しかった。